A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ameanboy 中级黑马   /  2016-3-18 12:49  /  460 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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不是已经被初始化赋值了吗。。
还是理解不能 我滚回去重学面向对象的基础概念了

1 个回复

倒序浏览
本帖最后由 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。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马