新人小白求解!!!求这段java程序的运行顺序?大神速来

zhongguohaomao 2016-06-05 07:14:40
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);
}
}


在eclips上面运行了,结果为
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied


这是为啥,不是按照多态调用吗,只有非静态方法是调子类的?为什么前两行为name为null
...全文
564 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProfeSir 2016-07-28
  • 打赏
  • 举报
回复
7楼说的我也有疑问,在执行父类构造函数的时候应该执行父类的方法吧,我自己去测试下。
-光 2016-07-28
  • 打赏
  • 举报
回复
引用 7 楼 zhangjihao 的回复:
1、多态俗称方法重写、覆盖,只针对方法,不针对属性(哪有子类属性覆盖父类属性的?1楼的好好复习复习吧)。 2、一个类型的指针指向子类实例化对象时,先初始化父类属性,然后执行父类的构造方法,并调用tellName()和printName()两个方法,此时要注意,由于多态特性,此时执行的实际上是子类的两个方法,而此时子类还没有实例化,那么子类的name属性也没有初始化,因此为null。 3、父类初始化后,接着实例化子类,此时子类name属性值也初始化为“dervied”,此时子类构造方法中调用两个方法就可以打印出现值。 PS: 关于1楼说的,在父类里改为protected String name = "base";,子类并不能覆盖这个“base”值,改成了protected或public只是能被子类通过super关键词来调用(当子类没有同样的属性时,则可以省略super)。但绝对不会覆盖属性值。
在调用父类构造函数的时候,调用的tellName()和printName()就已经是子类的了啊?
加油216 2016-07-28
  • 打赏
  • 举报
回复
受教了,基础的东西不牢固哈
sky_08_06_02 2016-07-27
  • 打赏
  • 举报
回复
7L精辟
MaxJemi 2016-06-16
  • 打赏
  • 举报
回复
7L正解
howsun_zh 2016-06-15
  • 打赏
  • 举报
回复
1、多态俗称方法重写、覆盖,只针对方法,不针对属性(哪有子类属性覆盖父类属性的?1楼的好好复习复习吧)。 2、一个类型的指针指向子类实例化对象时,先初始化父类属性,然后执行父类的构造方法,并调用tellName()和printName()两个方法,此时要注意,由于多态特性,此时执行的实际上是子类的两个方法,而此时子类还没有实例化,那么子类的name属性也没有初始化,因此为null。 3、父类初始化后,接着实例化子类,此时子类name属性值也初始化为“dervied”,此时子类构造方法中调用两个方法就可以打印出现值。 PS: 关于1楼说的,在父类里改为protected String name = "base";,子类并不能覆盖这个“base”值,改成了protected或public只是能被子类通过super关键词来调用(当子类没有同样的属性时,则可以省略super)。但绝对不会覆盖属性值。
nikyotensai 2016-06-15
  • 打赏
  • 举报
回复
引用 5 楼 securitit 的回复:
再说了,私有属性也能继承的吗!!!! 楼主同学!!! 当然是null了
+1
securitit 2016-06-15
  • 打赏
  • 举报
回复
再说了,私有属性也能继承的吗!!!! 楼主同学!!! 当然是null了
securitit 2016-06-15
  • 打赏
  • 举报
回复
执行顺序: 1.父类static方法 2.子类static方法 3.父类构造方法 4.子类构造方法 基础啊!!!!!
snakec0047 2016-06-15
  • 打赏
  • 举报
回复
你debug一下就清楚了,程序执行后先进入构造方法,由于继承先执行Base的构造方法,调用Dervied的两个方法,注意这里Base的构造方法里调用的是Dervied的方法,由于没有赋值所以都是null,然后回到自己的类赋值,调用方法
benjami_n 2016-06-15
  • 打赏
  • 举报
回复
7L正解
zhongguohaomao 2016-06-14
  • 打赏
  • 举报
回复
这个题我是从别的地方拿过来的,在工具里面可以运行啊,就是不知道为啥这个结果
Ordinary-1995 2016-06-05
  • 打赏
  • 举报
回复
private String name = "base"; private申明的对象是不可以继承的,所以对于“String name=base”是不可以使用private申明的,你可以用protected申明

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧