黑马程序员技术交流社区
标题:
下面这段代码,输出求解!
[打印本页]
作者:
ameanboy
时间:
2016-3-18 12:49
标题:
下面这段代码,输出求解!
本帖最后由 ameanboy 于 2016-3-18 22:50 编辑
public class Dervied extends Base {
private String name = "dervied";
public Dervied() {
tellName();
printName();
}
public void tellName() {
System.out.println("Dervied tell name: " + name);
}
public void printName() {
System.out.println("Dervied print name: " + name);
}
public static void main(String[] args){
new Dervied();
}
}
class Base {
private String name = "base";
public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}
public void printName() {
System.out.println("Base print name: " + name);
}
}
复制代码
输出结果是:
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied
复制代码
为什么呢。。name不是已经被初始化赋值了吗。。
还是理解不能 我滚回去重学面向对象的基础概念了
作者:
yijincheng
时间:
2016-3-18 21:00
本帖最后由 yijincheng 于 2016-3-18 21:05 编辑
这道题好屌。涉及了些java底层编译的知识。
可以参考一下这个链接里的内容。http://blog.csdn.net/vvqboy/article/details/7665952
大概原因就是:
1.java编译时,先让Dervied类进入到内存方法区,String name的空引用给你预备好了,但是还没new东西出来呢。你得先new父类,再new子类。
2.然后调用父类构造函数,此时name的值还是null;
3,最后再调用子类构造函数,此时才给Dervied在堆内new空间,name = dervied。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2