黑马程序员技术交流社区

标题: 求解释代码的运行结果 [打印本页]

作者: 溦丨涼    时间: 2015-7-18 12:04
标题: 求解释代码的运行结果
  1. public class Test extends Base {

  2.     private String name = "dervied";

  3.     public Test() {
  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 Test();   
  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. }
复制代码


为什么运行后是
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied

作者: 野驴少东    时间: 2015-7-18 13:51
本帖最后由 野驴少东 于 2015-7-18 13:52 编辑

你把Test构造函数中的tellName();  printName();删除了,看看效果,只是super()的调用。父类构造方法中的tellName(); printName();子类并不能调用父类中的私有属性,只是拥有。我想子类重写了父类属性name后,父类中的name属性地址可能被擦除了,地址为空Null(当然是相对于子类说的)。我也不敢确定:hug:
作者: 溦丨涼    时间: 2015-7-18 14:13
野驴少东 发表于 2015-7-18 13:51
你把Test构造函数中的tellName();  printName();删除了,看看效果,只是super()的调用。父类构造方法中的te ...

既然是super()的调用 ,为什么不是调用父类中的tellName()和printName()方法,而是直接调用了子类中的方法呢
作者: 野驴少东    时间: 2015-7-19 12:05
溦丨涼 发表于 2015-7-18 14:13
既然是super()的调用 ,为什么不是调用父类中的tellName()和printName()方法,而是直接调用了子类中的方 ...

其实我也不太明白,不过我感觉继承就像个鸡蛋,子类是蛋清,父类是蛋黄。同样的方法,子类里面有了,就不掉用父类的方法了:shutup:
作者: 差不多冬至    时间: 2015-7-19 12:23
个人觉得
生成子类对象时,会先调用父类的构造函数;然而你父类的属性是私有的,所以你调用时变出现了系统自动赋值的null
至于为啥先调用父类,必须先把父亲创建出来,他才可以有儿子嘛
作者: 幸_好    时间: 2015-7-19 20:40
路过 打酱油的
作者: 强强_U00ts    时间: 2015-7-19 21:11
路过,嘻嘻




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2