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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋美成 中级黑马   /  2014-3-15 13:05  /  1333 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于两个的继承,我比较明白;但是上了三个就不知道了
前提:如果A继承B,B继承C;
问题:1.在孙子类(A)建立对象的时候,会调用父类(B)的构造函数(因为存在隐式语句SUPER()),但是A会自动调用爷爷类(C)的构造函数吗?如果可以调用那它的原理是什么啊,是不是也存在一个类似于super的语句呢?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
爸爸的构造方法中第一句也有super();爸爸的会自动调用爷爷的

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
可以的。因为A中有父类B隐式的super(),同理父类B也会有它的父类C的隐式的super()。通过这种一级级的继承的方式实现调用爷爷类(C)中的构造函数。

点评

恩恩,明白了,谢谢  发表于 2014-3-15 15:12

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
这种多重继承的情况下:
虚拟机是要给这三个类都分配内存空间的。
也就是说:
1、调用A的构造函数(如果B有无参构造函数),则A的构造器的第一行,隐式调用B的构造函数即效果与super()
相同。
2、当B的构造函数被调用,则B的构造器的第一行,隐式调用C的构造函数,即效果也与super()相同。
参考如下代码:
  1. class C {
  2.         public C () {
  3.                 //这边隐式调用super(),即Object的构造器
  4.                
  5.                 System.out.println("C");
  6.         }
  7. }

  8. class B extends C {
  9.         public B () {
  10.                 //这边隐式调用super(),即C的构造器
  11.                
  12.                 System.out.println("B");
  13.         }
  14. }

  15. class A extends B {
  16.         public A () {
  17.                 //这边隐式调用super(),即B的构造器
  18.                
  19.                 System.out.println("A");
  20.         }
  21. }

  22. public class TClass {
  23.         public static void main(String[] args) {
  24.                 new A();
  25.         }
  26. }
复制代码

运行结果为:
C
B
A

点评

谢谢了,明白这个意思了  发表于 2014-3-15 15:11

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马