关于 Super 关键字的一点疑惑

海中一片帆 2014-07-03 12:20:10
public class Start {

public static void main(String[] args) {
Sub ob = new Sub();
System.out.println(ob + " bbb");
}

}

class Sub extends Father {
public Sub() {
// super(); 与下面这行代码为什么会有不同的输出。它们不都是调用 Father 的构造函数吗?
new Father();
System.out.println("Hello World.");
}
}

class Father {
public Father() {
System.out.println(this + " aaa");
}
}

问题就在 注释中
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2014-07-03
  • 打赏
  • 举报
回复
那个不是创建一个新的对象吗?super()是调用自己对象的构造方法.
业余草 2014-07-03
  • 打赏
  • 举报
回复
楼上回答都正确,super特殊关键字
姜小白- 2014-07-03
  • 打赏
  • 举报
回复
子类构造方法执行体中既没有super调用,也没有this调用,系统将会在执行子类构造方法之前,隐式调用父类无参数的构造方法。 显示的通过new 调用父类的构造方法前,子类的构造还是会默认通过super去调用父类的构造方法的。 如果给子类的构造方法中添加上this() 来调用自己的重载的构造方法,这时便不再默认调用父类的构造方法了。 类的继承和super的使用调用父类构造方法
hedley 2014-07-03
  • 打赏
  • 举报
回复
楼上说的都对, 我说的再通俗点,如果你不在Sub的构造类里显示调用super(),JVM会自动给你加上super(),即自动调用父类的无参构造型,所以这里你写那个super()跟不写没差别 如果Father里你声明一个有参数的构造型,例如Father(int i),而不声明无参的构造型,这时候你的Sub构造型里就必须自己显示的调用super(int i)了,你感受一下
rumlee 2014-07-03
  • 打赏
  • 举报
回复
这完全不是一回事。调用super方法,只是当前对象调用父类的构造方法而已。 但是new Father(),则是重新构造了一个父类的对象,则一共构造了两个对象了。
时熊猫Time 2014-07-03
  • 打赏
  • 举报
回复
Sub对象继承了Father,Sub就指向了Father中的地址 F1,然而你在sub中new Father();实际就等于又开辟了一个新的Father地址F2,所以输出的时候会多出一个“aaa”

62,614

社区成员

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

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