黑马程序员技术交流社区

标题: 关于子类构造函数继承父类构造函数的问题 [打印本页]

作者: Shimano    时间: 2014-4-9 09:05
标题: 关于子类构造函数继承父类构造函数的问题
  1. class Fu
  2. {
  3.         Fu()
  4.         {
  5.                 System.out.println("Fu run");
  6.         }
  7. }
  8. class Zi extends Fu
  9. {
  10.         Zi()
  11.         {
  12.                 //super();隐性语句
  13.                 System.out.println("Zi run");
  14.         }
  15.        
  16.         Zi(int x)
  17.         {
  18.                 //super();隐式语句
  19.                 System.out.println("Zi=="+x);
  20.                
  21.         }
  22. }
  23. class Demo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Zi z = new Zi();
  28.                 Zi z1 = new Zi(4);
  29.        
  30.         }
  31. }
复制代码
如上程序所示:
1.        当子类继承父类时,如果父类中有自定义无参数的的构造函数,
        那么是不是子类中在没有指定访问父类带参数的构造函数时,每一个子类的构造函数的第一行都有一个隐式的super();语句?
        是不是写不写该语句效果是一样的?
2.        如果当子类中没有自定义的无参数构造函数,也就是说有默认构造器Fu(){},那么子类中还有没有这个隐式的super();?
        是不是要手动的指明索要继承的构造函数?

希望就this,super,默认隐式构造函数,自定义无参数构造函数,有参数构造函数的知识,给予解答...


作者: 为你而去    时间: 2014-4-9 09:53
是的,都会有super()语句,构造函数继承的关系大致如下:
我们假设A是B的父类,B是A的子类。
  1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。
  2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
  3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)
作者: jingdou56    时间: 2014-4-9 09:56
子类中如果有指定的 super,就会去寻找指定的 父类构造函数!
如果没有,会在你调用的子类的构造函数的第一句自动加上 super()!
子类没有自定义构造函数,虚拟机也会自动为你添加上  类名() 构造函数!

毕老师 第七天 06视频,讲的也挺详细的,可以再看一下,我觉得直接用代码验证最直观!
希望对你有所帮助!
作者: 种一棵树    时间: 2014-4-9 09:57
extends关键字
表示子类继承父类的所有非私有成员和方法,作为自己的成员和方法.
如果子类中的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。
如果子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。
在子类中定义与父类相同的方法,称为方法的覆盖。

super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。
作者: 年轻的老头    时间: 2014-4-9 14:02
实际需要思考以下几个问题:
1.类什么时候加载
2.继承类的加载顺序
3.继承对象创建时初始化过程

1.类被使用才开始加载,加载时会执行静态数据成员的初始化。
2.继承类的加载顺序:先基础类(父类)后衍生类(子类)
3.继承对象创建时初始化过程:衍生类结构函数中如果没有显示的执行super某个构造函数,需要先隐形调用super()。




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