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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu951753xz 中级黑马   /  2014-10-4 15:28  /  1236 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
子父类构造函数
在对子类对象进行初始化时候,父类的构造函数也会运行,那是因为子类的构造函数默认第一行隐式的语句 super();super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类中的  构造函数  呢?
    因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句(如:super(34))的方式来指定。
注意:
super语句一定定义在子类构造函数的第一行
结论:
子类的所有构造函数,默认都会访问父类中空参数的构造函数
因为子类每一个构造函数第一行都有一句隐式的   super();
当父类中没有空参数的构造函数时。子类必须手动通过super语句形式
来指定要访问的构造函数。当然。子类的构造函数第一行也可以手动指定this语句来访问本类(子类)的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数。

其他的都理解了,但是 最后一句“ 子类中至少会有一个构造函数会访问父类中的构造函数。”这句不怎么理解,求谁帮我解释解释


  1. <p>
  2.         class Father
  3. {
  4. Father()
  5. {
  6.   System.out.println("Father run");
  7. }
  8. Father(int x)
  9. {
  10.   System.out.println("Father .. run " + x);
  11. }
  12. }</p><p>class Son extends Father
  13. {
  14. Son()
  15. {
  16.   //super();
  17.   System.out.println("Son run");
  18. }
  19. Son(int x)
  20. {
  21.   //super();
  22.   //this(); //Father run   Son run  Son..3 因为:子类的所有构造函数,默认都会访问父类中空参数的构造函数  
  23.   super(54);//Father .. run  54   Son..3  
  24.   System.out.println("Son.."+x);
  25. }
  26. }
  27. class ExtendsTest4</p><p>{
  28. public static void main(String[] args)
  29. {
  30.   Son s1= new Son();  //Father run   Son run
  31.   Son s2 = new Son(3);//Father .. run  54   Son..3      </p><p> }
  32. }
  33.         </p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

5 个回复

倒序浏览
简单的说,构造方法里面要么要调用自己其他的构造方法,要么要调用父类的构造方法,但是你能让所有的构造方法都调用自己的构造方法么?显然是不能的,因为那样就无限循环了。而一旦某个构造方法没有调用自己的其他构造方法,就要调用父类的构造方法了,即至少有一个构造方法会调用父类的构造方法。

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

回复 使用道具 举报
水竹 发表于 2014-10-4 15:47
简单的说,构造方法里面要么要调用自己其他的构造方法,要么要调用父类的构造方法,但是你能让所有的构造方 ...

能让所有的构造方法都调用自己的构造方法么?显然是不能的,因为那样就无限循环了。。原来这样,O(∩_∩)O谢谢
回复 使用道具 举报
二楼正解。刚看到继承么?
回复 使用道具 举报
至少有一个子类构造函数调用父类 然后其他子类函数去调用这个子类函数 从而实现 每个子类构造函数都调用了父类构造函数
其实只要保证了每个子类构造函数都调用过父类构造函数 这最后一句话自然是成立的 画蛇添足了 理论意义大于实际意义
回复 使用道具 举报
因为子类对象可以访问父类中的变量以及方法,所以在子类的构造函数中必须标明你要访问父类中的那一个构造方法,如果你不标明,那么他默认访问父类中空参的构造方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马