本帖最后由 ⋛⋌⋚JEEP 于 2014-8-6 16:06 编辑
楼主的问题楼上已经正确解决。这道题很有意思,可以加深Java中对多重继承应用的理解。我总结了一下:
- //多重继承的应用
- class Parent1 {
- Parent1(String s){
- System.out.println(s);//输出构造器Parent2(xxx)传来的参数。
- }
- }
- class Parent2 extends Parent1 {
-
- Parent2(String s) {
- super("parent3");//调用父类的构造方法,将参数传入父类带参数构造器。
- System.out.println(s);//输出构造器Parent2()传来的参数。
- }
- Parent2() {
- this("parent1");//此this调用本类有参数构造方法,将参数传到Parent2(xxx)中。
- System.out.println("parent2");
- }
- }
- public class Child extends Parent2 {
- /* Child(){
- super();
- }
- 如果本类没有自定义构造函数,系统会默认创建一个空参数的构造函数,
- 如果该类继承了某类,通常构造函数体内会隐式创建一个super()访问父类的空参数构造函数*/
- public static void main(String[] args) {
-
- Child child = new Child();//创建一个本类实例对象,()内没有参数说明本类构造函数是空参数的构造函数。
- }
- }
复制代码
运行结果:
parent3
parent1
parent2
- //这里只要是测试一下this()调用本类构造器的应用,与上面的对比加深理解。
- class Parent1 {
- Parent1(String s){
- System.out.println(s);//输出构造器Parent2()传来的参数。
- }
- }
- class Parent2 extends Parent1 {
-
- Parent2(String s) {
- this();//调用本类空参数的构造器Parent2()
- System.out.println(s);//输出构造器Child(xxx)传来的参数
- }
- Parent2() {
- super("parent1");//一个有继承关系的类中至少要有一个super()调用父类构造器,这里调用有参数的父类构造器Parent1(xxx)
- System.out.println("parent2");
- }
- }
- public class Child extends Parent2 {
- Child(int age){
- super("child");//有继承关系,需要super()一下。这里是传入参数,说明调用父类有参数的构造器。
- System.out.println("age:"+age);
- }//因为是有参数构造函数,所以不能省略了必须要自定义
- public static void main(String[] args) {
-
- Child child = new Child(12);//创建一个本类实例对象,对象初始化,这个小孩12岁,构造函数是有参数的。
- }
- }
复制代码
运行结果:
parent1
parent2
child
age:12
- 总结:这是对多重继承的复杂应用,更好的了解到,有继承关系,子类必须至少要调用父类构造方法一次(父类构造器可能不止一个),符号是super()或者super(xxx);
- 为什么必须调用父类的构造器,因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
- 需要注意的是:super()、this()调用父类或者本类构造函数的时候,必须放在调用本类构造函数体内第一行的位置。
- 关于多重继承,程序执行的顺序,看着复杂,其实是对构造函数重载的一个应用,只要注意参数列表的变化既可。
复制代码 |