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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 溦丨涼 中级黑马   /  2015-7-18 12:04  /  447 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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

6 个回复

倒序浏览
本帖最后由 野驴少东 于 2015-7-18 13:52 编辑

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

既然是super()的调用 ,为什么不是调用父类中的tellName()和printName()方法,而是直接调用了子类中的方法呢
回复 使用道具 举报
溦丨涼 发表于 2015-7-18 14:13
既然是super()的调用 ,为什么不是调用父类中的tellName()和printName()方法,而是直接调用了子类中的方 ...

其实我也不太明白,不过我感觉继承就像个鸡蛋,子类是蛋清,父类是蛋黄。同样的方法,子类里面有了,就不掉用父类的方法了:shutup:
回复 使用道具 举报
个人觉得
生成子类对象时,会先调用父类的构造函数;然而你父类的属性是私有的,所以你调用时变出现了系统自动赋值的null
至于为啥先调用父类,必须先把父亲创建出来,他才可以有儿子嘛
回复 使用道具 举报
路过 打酱油的
回复 使用道具 举报
路过,嘻嘻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马