黑马程序员技术交流社区
标题:
java继承问题
[打印本页]
作者:
小小
时间:
2012-6-3 09:46
标题:
java继承问题
package com.bag;
class Super {
int i = 10;
Super() {
print();
i = 20;
}
void print() {
System.out.println(i);
}
}
public class Sub extends Super {
int j = 30;
Sub() {
print();
j = 40;
}
void print() {
System.out.println(j);
}
public static void main(String[] args) {
System.out.println(new Sub().j);
}
}
复制代码
结果是 0
30
40
为什么不是 10
30
40
作者:
张少威
时间:
2012-6-3 09:55
http://bbs.itheima.com/forum.php?mod=attachment&aid=MzEzM3w0YTQ0ZmU4MDZkNWI0ZTQ0ZTc2NGZjNWNjZDI3YWI5ZHwxNzMyNTc0MTAz&request=yes&_f=.png
过程如下:
1. 虚拟机试图访问Sub.main这个静态方法
2. 当一个类第一次被访问的时候,才会被加载,如果有静态变量或称为类变量,那么在此
加载时会被初始化
3. 加载Sub类的时候,虚拟机注意到它有一个基类Super,那么Super类也会被加载
4. 当new Sub()的时候,第一件事儿就是在内存中划出一块足够存储Sub对象的空间,
这块空间会被清零,也就是说Sub对象的所有实例变量都会得到一个默认值,对于
这里的i,j就是0,如果是引用类型就是null
5. 执行Sub构造器,Sub有父类,所以执行Sub构造器的第一步就是执行父类的构造器,
构造器的执行过程是最让人迷惑的地方,下面试着做一下解释:
首先要明确构造器的作用,构造器的作用就是初始化对象,而不是创建对象。
其次要明确,执行构造器时第一要做的就是初始化对象,然后才是运行构造器中的语句。
什么叫初始化对象呢?就是按照语义从上到下依次执行一下你声明的字段。
jhkj.png
(20.95 KB, 下载次数: 65)
下载附件
2012-6-3 09:48 上传
作者:
小小
时间:
2012-6-3 10:02
谢谢,回答的非常满意
作者:
蒋映辉
时间:
2012-6-3 15:45
受益匪浅.....
作者:
陌花╮有意、
时间:
2012-6-3 21:33
package com.bag;
class Super {
int i = 10; //1.3
Super() { //1.2
print(); //1.4 这个地方调用子类的print,由于此时子类的J还没有显示初始化,所有输出0
i = 20; // 1.5
}
void print() {
System.out.println(i);
}
}
public class Sub extends Super {
int j = 30; //1.6
Sub() { //1.1
print(); //1.7 这里j已显示初始化为30 所以输出30
j = 40; //1.8
}
void print() {
System.out.println(j);
}
public static void main(String[] args) {
System.out.println(new Sub().j); //1.0 //1.9这里主函数输出j为40
}
}
希望可以帮到你
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2