黑马程序员技术交流社区

标题: 下面这段代码,输出求解! [打印本页]

作者: ameanboy    时间: 2016-3-18 12:49
标题: 下面这段代码,输出求解!
本帖最后由 ameanboy 于 2016-3-18 22:50 编辑
  1. public class Dervied extends Base {

  2.     private String name = "dervied";

  3.     public Dervied() {
  4.         tellName();
  5.         printName();
  6.     }
  7.    
  8.     public void tellName() {
  9.         System.out.println("Dervied tell name: " + name);
  10.     }
  11.    
  12.     public void printName() {
  13.         System.out.println("Dervied print name: " + name);
  14.     }

  15.     public static void main(String[] args){
  16.         
  17.         new Dervied();   
  18.     }
  19. }

  20. class Base {
  21.    
  22.     private String name = "base";

  23.     public Base() {
  24.         tellName();
  25.         printName();
  26.     }
  27.    
  28.     public void tellName() {
  29.         System.out.println("Base tell name: " + name);
  30.     }
  31.    
  32.     public void printName() {
  33.         System.out.println("Base print name: " + name);
  34.     }
  35. }
复制代码


输出结果是:
  1. Dervied tell name: null
  2. Dervied print name: null
  3. Dervied tell name: dervied
  4. 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