黑马程序员技术交流社区

标题: 关于继承 的疑惑,求开通思路 [打印本页]

作者: liu951753xz    时间: 2014-10-4 15:28
标题: 关于继承 的疑惑,求开通思路
/**
子父类构造函数
在对子类对象进行初始化时候,父类的构造函数也会运行,那是因为子类的构造函数默认第一行隐式的语句 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>
复制代码

作者: 水竹    时间: 2014-10-4 15:47
简单的说,构造方法里面要么要调用自己其他的构造方法,要么要调用父类的构造方法,但是你能让所有的构造方法都调用自己的构造方法么?显然是不能的,因为那样就无限循环了。而一旦某个构造方法没有调用自己的其他构造方法,就要调用父类的构造方法了,即至少有一个构造方法会调用父类的构造方法。
作者: liu951753xz    时间: 2014-10-4 16:00
水竹 发表于 2014-10-4 15:47
简单的说,构造方法里面要么要调用自己其他的构造方法,要么要调用父类的构造方法,但是你能让所有的构造方 ...

能让所有的构造方法都调用自己的构造方法么?显然是不能的,因为那样就无限循环了。。原来这样,O(∩_∩)O谢谢
作者: 18643448863    时间: 2014-10-4 17:48
二楼正解。刚看到继承么?
作者: 郑飞    时间: 2014-10-5 16:00
至少有一个子类构造函数调用父类 然后其他子类函数去调用这个子类函数 从而实现 每个子类构造函数都调用了父类构造函数
其实只要保证了每个子类构造函数都调用过父类构造函数 这最后一句话自然是成立的 画蛇添足了 理论意义大于实际意义
作者: wf111sxwf    时间: 2014-10-7 11:46
因为子类对象可以访问父类中的变量以及方法,所以在子类的构造函数中必须标明你要访问父类中的那一个构造方法,如果你不标明,那么他默认访问父类中空参的构造方法。




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