关于继承问题初始化的问题
2015-01-28 09:21
323 查看
今天在逛论坛时 看到个帖子提出的问题 出代码如下
这段程序的运行结果:
5
0
5
非常不可思议吧 为什么会有0这个值 貌似这段代码里没有0啊 再看
结果为:
5
子类show()方法
0
5
可以看到的确调用了子类的show方法 那么这个0应该是子类的num没错 可是为何是0呢? 再看
结果:
5
子类show()方法
null
5
这下可以看出在父类构造器中调用了子类的show方法 这时子类只进行了jvm默认的初始化 并未进行赋值操作(即把3赋给num)
所以输出结果是0和null
本人没有深入了解过jvm 以上仅是个人推测而已!
结论:不要在父类构造器中调用任何需要用到子类成员变量的方法 因为子类还未完成初始化操作
--------------version1.0 2015.1.28
下面是一道面试题
看看下面两段代码
//code_1
public class SingleInstance {
private static SingleInstance si = new SingleInstance(); //注意这里
public static int num_1;
public static int num_2 = 0;
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果: 1:1
1:0
//code_2
public class SingleInstance {
public static int num_1;
public static int num_2 = 0;
private static SingleInstance si = new SingleInstance(); //注意,跟上面不一样了
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果:1:1
1:1
很奇怪吧 为什么两个的结果不一样
可以分析
在code_1中
编译期间对num_1 num_2 SingleInstance 进行了默认初始化
然后开始运行
因为java按自上而下的顺序运行
所以先执行了构造方法 num1++,num2++
并输出了1:1
然后执行了num2=0; 再调用print()方法 输出了1:0
而在code_2中
先执行了num2=0 再调用构造方法输出1:1
再调用构造方法输出了1:1
以上只是猜测!!!
再看下面代码
//code_3
public class SingleInstance {
private static SingleInstance si = new SingleInstance(); //注意这里
public int num_1; //注意这里
public int num_2 = 0; //注意这里
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果:1:1
1:1
总结:
<span style="font-size:14px;">class Fu{ int num = 5; Fu(){ System.out.println(num); show(); //55 System.out.println(num); //5 } void show(){ System.out.println("55"); } } class Zi extends Fu{ int num = 3; Zi(){ } void show() { System.out.println(num); } } public class Demo { public static void main(String[] args) { Zi z = new Zi(); } }</span>
这段程序的运行结果:
5
0
5
非常不可思议吧 为什么会有0这个值 貌似这段代码里没有0啊 再看
<span style="font-size:14px;">class Fu{ int num = 5; Fu(){ System.out.println(num); show(); //55 System.out.println(num); //5 } void show(){ System.out.println("55"); } } class Zi extends Fu{ int num = 3; Zi(){ } void show() { <span style="color:#ff0000;">System.out.println("子类show()方法") ; </span> </span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>System.out.println(num); } } public class Demo { public static void main(String[] args) { Zi z = new Zi(); } }</span>对上面代码做出修改
结果为:
5
子类show()方法
0
5
可以看到的确调用了子类的show方法 那么这个0应该是子类的num没错 可是为何是0呢? 再看
<span style="font-size:14px;">class Fu{ <span style="color:#ff0000;">String num = "5";</span> Fu(){ System.out.println(num); show(); //55 System.out.println(num); //5 } void show(){ System.out.println("55"); } } class Zi extends Fu{ <span style="color:#ff0000;">String num = "3";</span> Zi(){ } void show() { <span style="color:#ff0000;">System.out.println("子类show()方法") ; </span> </span>
<span style="font-size:14px;"><span> </span>System.out.println(num); } } public class Demo { public static void main(String[] args) { Zi z = new Zi(); } }</span>
结果:
5
子类show()方法
null
5
这下可以看出在父类构造器中调用了子类的show方法 这时子类只进行了jvm默认的初始化 并未进行赋值操作(即把3赋给num)
所以输出结果是0和null
本人没有深入了解过jvm 以上仅是个人推测而已!
结论:不要在父类构造器中调用任何需要用到子类成员变量的方法 因为子类还未完成初始化操作
--------------version1.0 2015.1.28
下面是一道面试题
看看下面两段代码
//code_1
public class SingleInstance {
private static SingleInstance si = new SingleInstance(); //注意这里
public static int num_1;
public static int num_2 = 0;
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果: 1:1
1:0
//code_2
public class SingleInstance {
public static int num_1;
public static int num_2 = 0;
private static SingleInstance si = new SingleInstance(); //注意,跟上面不一样了
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果:1:1
1:1
很奇怪吧 为什么两个的结果不一样
可以分析
在code_1中
编译期间对num_1 num_2 SingleInstance 进行了默认初始化
然后开始运行
因为java按自上而下的顺序运行
所以先执行了构造方法 num1++,num2++
并输出了1:1
然后执行了num2=0; 再调用print()方法 输出了1:0
而在code_2中
先执行了num2=0 再调用构造方法输出1:1
再调用构造方法输出了1:1
以上只是猜测!!!
再看下面代码
//code_3
public class SingleInstance {
private static SingleInstance si = new SingleInstance(); //注意这里
public int num_1; //注意这里
public int num_2 = 0; //注意这里
public SingleInstance() {
num_1 ++;
num_2 ++;
System.out.println(num_1 + ":" + num_2);
}
public static SingleInstance getInstance() {
return si;
}
public void print() {
System.out.println(num_1 + ":" + num_2);
}
public static void main(String[] args) {
SingleInstance.getInstance().print();
}
}
结果:1:1
1:1
总结:
相关文章推荐
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- 关于继承与构造函数重载的问题(初始化子类构造函数中的父类对象)求解答。。。
- [cocos2d-x]关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- 关于虚拟目录继承根Web.Config的问题解决办法
- C++中关于类中常数静态成员初始化的问题
- c#过程中遇到的关于构造函数和继承的问题
- 一个关于继承和多态的问题(思索篇)
- 关于虚拟目录继承根Web.Config的问题解决办法
- [导入]关于petshop中simplepager(继承自Repeater)覆写DataSource的问题
- 关于全局、static对象/变量的初始化问题
- 关于虚拟目录继承根Web.Config的问题解决办法
- 关于AE9.2License初始化问题
- Java中关于构造函数继承的相关问题
- JAVA中关于继承和隐藏的一个另类问题。
- 关于树的数据结构初始化问题?
- 蛙蛙请教:关于ajax,xmlhttp跨域请求和HTC组件的CSS继承问题
- 关于JAVA中变量的初始化及类属性的默认值问题
- 一道关于继承类的sizeof大小问题