黑马程序员技术交流社区
标题:
关于子类构造函数继承父类构造函数的问题
[打印本页]
作者:
Shimano
时间:
2014-4-9 09:05
标题:
关于子类构造函数继承父类构造函数的问题
class Fu
{
Fu()
{
System.out.println("Fu run");
}
}
class Zi extends Fu
{
Zi()
{
//super();隐性语句
System.out.println("Zi run");
}
Zi(int x)
{
//super();隐式语句
System.out.println("Zi=="+x);
}
}
class Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
Zi z1 = new Zi(4);
}
}
复制代码
如上程序所示:
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