- 浏览: 25100 次
- 来自: 北京
最新评论
class Parent{ int x=10; public Parent(){ add(2); } void add(int y){ x+=y; } } class Child extends Parent{ int x=9; void add(int y){ x+=y; } public static void main(String[] args){ Parent p=new Child(); System.out.println(p.x); } }
问输出结果是什么?
答案应该是10。
要理解结果为什么是10,需要首先明白下面的知识:
(1)Java中变量和方法在继承时隐藏与覆盖的含义:
隐藏:若B隐藏了A的变量或方法,那么B不能访问A被隐藏的变量或方法,但将B转换成A后可以访问A被隐藏的变量或者方法。
覆盖:若B覆盖了A的变量或者方法,那么不仅B不能访问A被覆盖的变量或者方法,将B转换成A后同样不能访问A被覆盖的变量或者方法。
(2)Java中变量与方法在继承中隐藏与覆盖的规则:
一、父类的实例变量和类变量能被子类的同名变量隐藏。
二、变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。
三、 父类的静态方法被子类的同名静态方法隐藏,父类的实例方法被子类的同名实例方法覆盖。
四、 不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。
五、 用final关键字修饰的最终方法不能被覆盖。
六、 friendly protected public 修饰符不影响,private属性守访问权限的限制,不能被覆盖。
在上面的试题中,子类Child的实例方法add(int y)覆盖了父类Parent的实例方法add(int y),而子类的实例变量x则是隐藏了父类的实例变量x。
Child对象的初始化过程是:
1 为父类的实例变量x分配内存空间,因为在定义变量x时为它赋了值(int x=10),所以会同时将这个值赋给x。
2 调用父类的无参构造函数,Parent的构造函数中做的唯一的事情就是调用了add(2);
3 由于子类的add(int y)方法覆盖了父类的方法,所以add(2)实际调用的是子类的方法,在子类的add方法中做了如下操作x+=j;在这里由于子类的实例变量x隐藏了父类 的实例变量x,所以这条语句是针对子类本身的,但是这时还没有为子类的实例变量x分配空间,它的默认值是0,加2之后是2。
4 父类初始化完毕后接着初始化子类,为子类的x分配内存空间并将它赋值为9,之前的add(2)操作无效。
5 注意Parent p=new Child();这条语句,它是用父类的引用指向子类的对象,而前面已经说过变量只会被隐藏不会被覆盖,所以这时的p.x值应该是父类的10,而不是子类的9;
如果将输出语句换成下面的语句结果就是9了:
System.out.println(((Child)p).x); //首先将p转换成Child类型
发表评论
-
单例模式Singleton
2012-03-22 16:36 0public class Printer { privat ... -
Java数字金字塔
2012-03-18 00:39 3254用java实现如下: 1 12 ... -
Java StringBuffer调用append时的空指针异常
2012-03-16 18:02 2299StringBuffer s = null; System ... -
Java中的17种常用正则表达式
2012-03-15 14:04 87201、"^d+$" //非负整数(正整数 ... -
Java求连续和为某数的数字序列
2012-03-15 14:02 1188public class ContinuousSum { ... -
Java找出数组中唯一的出现奇数次的数
2012-03-15 14:00 2603import java.util.*; public c ... -
Java统计文档中英文单词个数
2012-03-15 13:57 4001public class CountWords { p ... -
Java中自增自减、按位、移位运算符
2012-03-11 09:58 1990一 自增与自减运算符遵循以下规律: 1. 可以用于整数类型b ... -
JAVA中String的生成、串接及其intern()方法
2012-03-11 09:59 1180public class StringTest { ... -
Java中基础数据类型和String之间的转换
2012-03-11 09:59 8551 如何将字串 String 转换成整数 int? A. ... -
Java中字符串倒序
2012-03-10 15:52 1270//转换成字符数组逆序输出 public static ... -
Java中继承情况下类的初始化顺序
2012-03-10 15:51 627父类--静态变量 父类--静态初始化块 子类--静态变量 ... -
Java中final、finally 和 finalize
2012-03-10 15:50 723一 final final可以用来修饰: ... -
Java String杂谈
2012-03-10 15:49 5601. public class ChineseTest { ... -
Java中的基本类型
2012-03-10 15:20 7811 对于基本类型void以 ...
相关推荐
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
代码中设计了各个类的基类,设置私有成员变量,利用构造器对成员变量初始化,用geter、seter访问器设置、获取成员变量的值。继承基类并创建对象,在子类中调用父类方法。
子类初始化前,会先加载并初始化它的父类 初始化一个类,其实质上就是执行了()方法 ()方法包含了,静态变量显式赋值代码以及静态代码块 静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先...
errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...
组合复用:选取某个类型中的一个对象的方法实现作为该类的方法实现过程,这两个类也称为理论父类和理论子类. 程序中是不出现extends关键字对两个类关系的描述的. 通过具体实例抽象出父类的过程称为泛化 通过...
程序中主类的静态变量会在main方法执行前初始化。 不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时 未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化...
•子类扩展了父类,将可以获得父类的全部属性和方法,但不能获得父类构造器 •Java里的继承都是单继承,也就是只能有一个直接的父类,可以有n个间接父类。 重写父类的方法 •方法的重写要遵循“两同两...
还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...
和行为应为与变量和方法相对应。自行车的状态:数度是 10mp(每小时 10 米),步度是 90rpm (每分钟 90 转),当前传动装置是第 5 个齿轮。再面向对象的程序设计中,这些数据应放在 变量中。自行车的行为:刹车,...
第四章 面向对象的概念和 Java 实现-2 回顾 类是具有相同属性和行为的一组对象的 集合 , 对象是类的实例 封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 类可用Class 来定义,类的变量和方法可被该类的...
(4)一个子类继承父类,子类不可以继承父类中访问权限设定为 的变量和方法. A)public B) protected C)private D)未修饰 (5) 下列叙述正确的是 A) 在类中的构造方法的名字与类的名字相同, 而且不能重载 B) 在...
5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入...
3、所有类至少有一个构造器,构造器用来初始化类的新对象,构造器与类同名,返回类型只能为void。 ( ) 4、包是按照目录、子目录存放的,可以在程序中用package定义包,若没有package一行,则表示该文件中的类不...
静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....
在Java中,多态性通过方法重写和方法重载来实现。方法重写是指子类重新定义父类的方法,而方法重载是指在同一个类中定义多个同名但参数列表不同的方法。 3.什么是Java的静态关键字? 静态关键字用于修饰类的成员...
8.1 父类和子类 8.2 super构造方法调用 8.3 封装和继承 8.4 使用继承 8.4.1 Object类 8.4.2 定义equals方法 8.5 关于设计好继承的几点建议 8.6 实例:一卡通类的继承 8.6.1 构造方法 8.6.2 setter方法 ...
《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 9. 阅读下列程序片段,...由于子类拥有父类所有的属性和方法,所以输出的是ShappeCircle。
5.在异常处理中,若try中的代码可能产生多种异常则可以对应多个catch语句,若catch中的参数类型有父类子类关系,此时应该将父类放在后面,子类放在前面. ( √ ) 6.拥有abstract方法的类是抽象类,但抽象类中...
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...