关于java子类创建对象时,父类做了什么的问题

A_Little_Whale 2019-02-03 01:05:11
代码一:
public class Animal {
public String name = "animal";
public Animal(){
printInfo();
}
public void printInfo() {
System.out.println(name);
}

}
class Dog extends Animal{
public String name = "dog";

public void printInfo(){

System.out.println(name);
}
public static void main(String[] args) {
Dog dog = new Dog();
}
}
输出 : null

代码二:
public class Animal {
public String name = "animal";
public Animal(){
printInfo();
}
public void printInfo() {
System.out.println(name);
}

}
class Dog extends Animal{
public String name = "dog";

public void printInfo(){

System.out.println(super.name);
}
public static void main(String[] args) {
Dog dog = new Dog();
}
}
输出: animal
这是为什么呢? 我知道new子类对象的时候 不会去创建父类对象,只是调用父类的构造方法,但是为什么两段代码输出会不一样??
...全文
220 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_Little_Whale 2019-02-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_39936465 的回复:
漏了一点,因为子类方法与父类方法同名,所以父类构造方法中的printInfo(),也是调用子类的方法。
这么一补充就懂了!感谢🙏
winrh 2019-02-03
  • 打赏
  • 举报
回复
首先子类重写了父类的printInfo()方法,所以调用的时候是子类的方法,不信你在父类的方法里添加输出语句。 其次这里,子类实例化,默认调父类无参构造器,然后先初始化父类的name,然后调用printInfo(),跳到子类的printInfo(),子类输出name,此时第一题子类的name还没有初始化,所以是null,而第二题调用父类的name,是有值的。子类printInfo()执行完,回到子类,完成子类name的初始化。
qq_39936465 2019-02-03
  • 打赏
  • 举报
回复
漏了一点,因为子类方法与父类方法同名,所以父类构造方法中的printInfo(),也是调用子类的方法。
qq_39936465 2019-02-03
  • 打赏
  • 举报
回复
第一段程序,new初始化 先初始化子类构造方法,子类构造法默认super(),先初始化父类构造方法,此时父类name虽然被初始值,但是子类有name和父类name同名,默认调用的是子类变量name,而子类name此时还未初始化所以输出name为null。第二段用的super.name,这是调用父类的name所以能输出animal。
麻笑宇 2019-02-03
  • 打赏
  • 举报
回复
你后面那段代码输出的是super的name,也就是回去找父类的name属性,如果找到就会输出。

62,614

社区成员

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

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