黑马程序员技术交流社区

标题: 子类每一个构造函数内的第一行都有一句隐式super() [打印本页]

作者: 飘过的云    时间: 2015-5-19 01:05
标题: 子类每一个构造函数内的第一行都有一句隐式super()
子父类中的构造函数:
在对子类对象进行初始化时,父类的构造函数也会运行。
那是因为子类的构造函数默认第一行有一条隐式的语句super();
super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动第一super语句的方式指定。
注意:super语句一定定义在子类构造函数的第一行。

子类的实例化过程:
结论:
子类的所有的构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中德构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。
作者: 枕寒流    时间: 2015-5-19 08:19
总结的很到位,,,
作者: 王建伟    时间: 2015-5-19 09:57
不是这样吧,子类构造函数中没有super();也要执行父类的构造函数的,你看看这个代码。
  1. class X {
  2.         Y b = new Y();
  3.         X() {
  4.                         System.out.print("X");
  5.         }
  6. }

  7. class Y {
  8.         Y() {
  9.                         System.out.print("Y");
  10.         }
  11. }

  12. public class Z extends X {
  13.         Y y = new Y();
  14.         Z() {
  15.                         System.out.print("Z");
  16.         }

  17.         public static void main(String[] args) {
  18.                         new Z();
  19.         }
  20. }
复制代码



作者: 志行    时间: 2015-5-19 09:59
说得很好 受教了
作者: sxsxsx    时间: 2015-5-19 10:22
学习学习,谢谢分享
作者: mmakun    时间: 2015-5-19 13:19
总结的不错,受用了
作者: 飘过的云    时间: 2015-5-19 21:27
王建伟 发表于 2015-5-19 09:57
不是这样吧,子类构造函数中没有super();也要执行父类的构造函数的,你看看这个代码。

...

我的思路:
1、找主函数 :
2、new Z()
3、因为Z继承了X
4、第一行 super(),即就是访问x,并对其进行初始化。
5、发现 X先创建了一个Y对象。
6、那么就需要先将Y进行初始化,然后就去Y类中。
7、执行 无参构造函数,打印一个Y。Y类初始化结束,返回X类,继续执行。
8、X调用无参构造函数初始化。打印X。X类初始化完成。返回Z类中,继续执行下一步。
9、发现又需要创建一个新的Y类,然后去Y类,打印一个Y。(相当于=号赋值初始化,先于构造函数初始化执行的)
10、进行 构造函数初始化,打印Z。
结果:YXYZ

第9步,不懂看这个链接
http://bbs.itheima.com/thread-197355-1-1.html
作者: 王建伟    时间: 2015-5-19 21:45
飘过的云 发表于 2015-5-19 21:27
我的思路:
1、找主函数 :
2、new Z()

我只是说你这句话
    在对子类对象进行初始化时,父类的构造函数也会运行。
    那是因为子类的构造函数默认第一行有一条隐式的语句super();
    super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
子类构造函数中并不一定都有super();但是还是会调用父类的构造函数我让你看的代码是没有super()的,你木有理解我的意思。
作者: 飘过的云    时间: 2015-5-19 21:48
王建伟 发表于 2015-5-19 21:45
我只是说你这句话
    在对子类对象进行初始化时,父类的构造函数也会运行。
    那是因为子类的构造函数 ...

现在还是没理解啊 不过你说的是对的 支持你一下 呵呵
作者: 探索者    时间: 2015-5-19 22:32
王建伟 发表于 2015-5-19 09:57
不是这样吧,子类构造函数中没有super();也要执行父类的构造函数的,你看看这个代码。

...

不是没有,而是隐式的,这是在没有自定义super()的情况下,子类构造函数中第一行会有一句隐式的supei()语句
作者: 王建伟    时间: 2015-5-19 23:05
探索者 发表于 2015-5-19 22:32
不是没有,而是隐式的,这是在没有自定义super()的情况下,子类构造函数中第一行会有一句隐式的supei()语 ...

哦哦  这样啊,楼主是正确的,我没有看见是隐式的,哈哈,受教了
作者: 飘过的云    时间: 2015-5-20 21:12
王建伟 发表于 2015-5-19 23:05
哦哦  这样啊,楼主是正确的,我没有看见是隐式的,哈哈,受教了

呵呵 隐式super 和 this,一定要掌握额,基础题极有可能会出
作者: 黄冬    时间: 2015-5-20 21:27
对的,而且是默认调用父类的无参构造
作者: 王建伟    时间: 2015-5-20 21:59
飘过的云 发表于 2015-5-20 21:12
呵呵 隐式super 和 this,一定要掌握额,基础题极有可能会出

恩恩  谢谢。。。
作者: 18463730277    时间: 2015-5-20 22:26
super语句一定定义在子类构造函数的第一行
作者: 守株人    时间: 2015-5-20 23:13
谢谢分享,赞一个
作者: 星辉祝愿    时间: 2015-5-20 23:27
总结得好,受教了
作者: 守株人    时间: 2015-5-20 23:47
谢谢分享,学习了
作者: 飘过的云    时间: 2015-5-20 23:56
王建伟 发表于 2015-5-20 21:59
恩恩  谢谢。。。

客气了,互相学习,呵呵




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2