使用组合为什么还会出现继承现象?

kkk只学习不偷懒 2018-09-09 06:31:39
public class Problem {

public static void main(String[] args){
Bird2 b = new Bird2();
}

public Problem(){
//super(); //构造器中super()必须是第一句
System.out.print("构建一个动物" + "\n");
}
}

class Bird2 {
Problem p = new Problem();

public Bird2() {
//super();
System.out.println("建一个鸟对象");
}
}

运行结果:
构建一个动物
建一个鸟对象

这里明明没有用到继承的方法,Bird2 b = new Bird2();语句不是调用Bird2中的构造器吗?为什么会打印“构建一个动物”这句?求大神解答,谢谢!
...全文
187 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 nayi_224 的回复:
关继承什么事,连extends关键字都没有。
new一个类的时候会先加载成员变量。而你的成员变量就是 Problem p = new Problem();当然会先加载Problem 的构造方法。
感谢,终于弄明白了!
  • 打赏
  • 举报
回复
引用 6 楼 new_bug1234 的回复:
system.out.print("1"),以此来标识一下,然后运行下就可以看出来,我觉得可能是两处声明对象在互相调用,运行不到构造方法。
感谢回答,应该是七楼说的那个原因了
nayi_224 2018-09-10
  • 打赏
  • 举报
回复
关继承什么事,连extends关键字都没有。
new一个类的时候会先加载成员变量。而你的成员变量就是 Problem p = new Problem();当然会先加载Problem 的构造方法。
new_bug1234 2018-09-10
  • 打赏
  • 举报
回复
两句都没有?我觉得你可以在两处初始化对象的前后加上语句,比如systwm.
new_bug1234 2018-09-10
  • 打赏
  • 举报
回复
system.out.print("1"),以此来标识一下,然后运行下就可以看出来,我觉得可能是两处声明对象在互相调用,运行不到构造方法。
verejava 2018-09-10
  • 打赏
  • 举报
回复
Java 面向对象 之 继承

http://www.verejava.com/?id=16992791427944
冲上云霄 、 2018-09-10
  • 打赏
  • 举报
回复
当你new bird2的时候会加载你的bird2类,从而创造一个空构造器的bird2类对象,而你这个类中又new Problem一下,所以会先构建一个problem对象,所以会出现以上打印效果。简单点说就是想要创建bird2这个类的对象要先加载完这个类,类中new了 promblem所以加载这个类必然会先创建problem对象
  • 打赏
  • 举报
回复
但我在debug时在Bird2 b = new Bird2();处停止,按道理应该可以打印到“构建一个动物”的,但事实上两句都没有,应该不是这个原因?
  • 打赏
  • 举报
回复
引用 1 楼 alineboyish 的回复:
构造方法会随着类的加载而加载,所以你的代码应该是先加载Problem类和它的构造方法,所以打出了“构建一个动物”。
但我在debug时在Bird2 b = new Bird2();处停止,按道理应该可以打印到“构建一个动物”的,但事实上两句都没有,应该不是这个原因?
alineboyish 2018-09-09
  • 打赏
  • 举报
回复
构造方法会随着类的加载而加载,所以你的代码应该是先加载Problem类和它的构造方法,所以打出了“构建一个动物”。

62,628

社区成员

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

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