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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题,学到继承部分的时候,有一个知识点是子类的构造必然会先访问父类构造,即在默认的子类构造函数中第一行必然是super();,而在学构造函数的时候提到,new Person()就是在调用Person的构造函数Person(){},也就是说super()语句是在创建一个父类对象。此时,如果在主类中实例化一个子类对象,那么此时为什么只产生了一个对象而不是两个呢?求指点!

6 个回复

倒序浏览
没人看到吗?
回复 使用道具 举报
楼主的问题看起来不是很明朗,建议把代码加解释附上讨论下。
回复 使用道具 举报
  1. class Father
  2. {
  3.         Father(){}//默认执行空参构造
  4. }
  5. class Son extends Father
  6. {
  7.         Son(){ //默认执行空参构造
  8.                 super(); //默认第一行调用父类构造
  9.         }
  10. }
  11. class Demo
  12. {
  13.         public static void main(String[] args){
  14.                 new Son();
  15.         }
  16. }
复制代码
如上,我这里把默认的构造函数写出来了,在创建一个子类对象的时候,默认的子类构造函数会调用父类构造,而调用构造函数即创建对象,即在此时内存中产生了一个父类对象,这样一来在内存中到底是只有一个子类对象还是有一个子类一个父类两个对象呢?
回复 使用道具 举报
xiaoxiyang 发表于 2014-12-2 12:48
楼主的问题看起来不是很明朗,建议把代码加解释附上讨论下。

麻烦看一下代码,可以说明一下这种情况下的内存状态吗?谢谢
回复 使用道具 举报
说说小弟的愚见:当调用子类的构造方法时,系统会在堆内存中找个位置准备开始将其内容写入,第一句就是调用父类的构造方法super();,这时就开始在这个位置上写入父类的内容,写完后又开始写子类自己的内容。于是对象就被这么创建了,但是整个过程栈中只有一个地址指向堆内存中开始写入的位置,所以也就只能看到一个对象了。小弟不是计算机专业的,可以问了问他们,就理解到这种程度,也不知道对不对,还请各位指点!!
回复 使用道具 举报
getone 中级黑马 2014-12-8 21:32:24
7#
chudaming213 发表于 2014-12-6 13:44
说说小弟的愚见:当调用子类的构造方法时,系统会在堆内存中找个位置准备开始将其内容写入,第一句就是调用 ...

为什么前天的回复今天才看到……学习了,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马