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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大xiaoぃ伙子。 中级黑马   /  2014-8-5 22:47  /  1092 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Parent1 {
    Parent1(String s){
        System.out.println(s);
    }
}
class Parent2  extends Parent1{
    Parent2(){
        System.out.println("parent2");
    }
}
public class Child extends Parent2 {
    public static void main(String[] args) {
        Child child = new Child();
    }
}
这个哪错了啊 半天没看出来

10 个回复

倒序浏览
首先调用Child类的默认构造器Child();

在Child类的默认构造器里会自动调用其父类的无参构造器也就是Parent2();

在无参构造器Parent2();的第一行会自动调用其父类Parent1的无参构造器,不过因为其父类Parent1拥有有参构造
器,所以系统就不会为其创建无参构造器

综上所述,结果就会出现编译错误!
回复 使用道具 举报
楼上正解啊
回复 使用道具 举报
非常精辟
回复 使用道具 举报
本帖最后由 ⋛⋌⋚JEEP 于 2014-8-6 16:06 编辑

楼主的问题楼上已经正确解决。这道题很有意思,可以加深Java中对多重继承应用的理解。我总结了一下:
  1. //多重继承的应用
  2. class Parent1 {
  3.     Parent1(String s){
  4.         System.out.println(s);//输出构造器Parent2(xxx)传来的参数。
  5.     }
  6. }
  7. class Parent2  extends Parent1 {
  8.         
  9.         Parent2(String s) {
  10.                 super("parent3");//调用父类的构造方法,将参数传入父类带参数构造器。
  11.                 System.out.println(s);//输出构造器Parent2()传来的参数。
  12.         }
  13.         Parent2() {
  14.                 this("parent1");//此this调用本类有参数构造方法,将参数传到Parent2(xxx)中。
  15.         System.out.println("parent2");
  16.     }
  17. }
  18. public class Child extends Parent2 {
  19.         /*        Child(){
  20.                     super();
  21.             }
  22. 如果本类没有自定义构造函数,系统会默认创建一个空参数的构造函数,
  23. 如果该类继承了某类,通常构造函数体内会隐式创建一个super()访问父类的空参数构造函数*/
  24.     public static void main(String[] args) {
  25.             
  26.         Child child = new Child();//创建一个本类实例对象,()内没有参数说明本类构造函数是空参数的构造函数。
  27.     }
  28. }
复制代码

运行结果:
parent3
parent1
parent2
  1. //这里只要是测试一下this()调用本类构造器的应用,与上面的对比加深理解。
  2. class Parent1 {
  3.   Parent1(String s){
  4.       System.out.println(s);//输出构造器Parent2()传来的参数。
  5.   }
  6. }
  7. class Parent2  extends Parent1 {
  8.         
  9.         Parent2(String s) {
  10.                 this();//调用本类空参数的构造器Parent2()
  11.                 System.out.println(s);//输出构造器Child(xxx)传来的参数
  12.         }
  13.         Parent2() {
  14.                 super("parent1");//一个有继承关系的类中至少要有一个super()调用父类构造器,这里调用有参数的父类构造器Parent1(xxx)
  15.                 System.out.println("parent2");
  16.         }
  17. }
  18. public class Child extends Parent2 {
  19.         Child(int age){
  20.                 super("child");//有继承关系,需要super()一下。这里是传入参数,说明调用父类有参数的构造器。
  21.                 System.out.println("age:"+age);
  22.         }//因为是有参数构造函数,所以不能省略了必须要自定义
  23.         public static void main(String[] args) {
  24.                
  25.                 Child child = new Child(12);//创建一个本类实例对象,对象初始化,这个小孩12岁,构造函数是有参数的。
  26.         }
  27. }
复制代码

运行结果:
parent1
parent2
child
age:12
  1. 总结:这是对多重继承的复杂应用,更好的了解到,有继承关系,子类必须至少要调用父类构造方法一次(父类构造器可能不止一个),符号是super()或者super(xxx);
  2. 为什么必须调用父类的构造器,因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
  3. 需要注意的是:super()、this()调用父类或者本类构造函数的时候,必须放在调用本类构造函数体内第一行的位置。
  4. 关于多重继承,程序执行的顺序,看着复杂,其实是对构造函数重载的一个应用,只要注意参数列表的变化既可。
复制代码
回复 使用道具 举报
楼上不错啊...
回复 使用道具 举报
楼上不错
回复 使用道具 举报
⋛⋌⋚JEEP 发表于 2014-8-6 15:56
楼主的问题楼上已经正确解决。这道题很有意思,可以加深Java中对多重继承应用的理解。我总结了一下:

运行 ...

是parent2少一个无参数的构造方法么
回复 使用道具 举报
草鱼狂飙 发表于 2014-8-6 06:04
首先调用Child类的默认构造器Child();

在Child类的默认构造器里会自动调用其父类的无参构造器也就是Parent ...

谢谢啦 就是因为parent2里没有无参数的构造 是吧?
回复 使用道具 举报
大xiaoぃ伙子。 发表于 2014-8-6 21:12
是parent2少一个无参数的构造方法么

你仔细看看面向对象的继承特征是怎么讲的,再理解一下沙发那楼兄弟说的意思。如果你都理解透彻了,看看我写的,如有不妥,希望指正:)
回复 使用道具 举报
⋛⋌⋚JEEP 发表于 2014-8-6 23:22
你仔细看看面向对象的继承特征是怎么讲的,再理解一下沙发那楼兄弟说的意思。如果你都理解透彻了,看看我 ...

已解决 谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马