为什么不调用SuperClass构造函数?

时间:2017-10-10 07:38:17

标签: java constructor

我有一个课程Demo如下:

public class Demo extends Animal{

private int id;

public Demo(){


    System.out.println("ChildClass Constructor Called!!!");
}

public Demo(int id , String name){

    super(name);
    this.id = id;
}

public static void main(String[] args){

    Demo d = new Demo();

    System.out.println(d.id + " " + d.name);
}

和另一个班级Animal如下:

public class Animal{

String name;

Animal(){

    System.out.println("SuperClass Constructor Called!!!");
}

Animal(String name){

    this.name = name;
}

该计划的输出是:

SuperClass Constructor Called!!!
ChildClass Constructor Called!!!
0 null

但是当我在this()类中包含Demo时,输出如下:

ChildClass Constructor Called!!!
0 null

超类构造函数未调用?是什么原因?

在另一个例子中:

public class A {

    A() {

        this(0);
        System.out.println("Hi ");

    }

    A(int x) {

        this(0, 0);
        System.out.println("Hello");

    }

    A(int x, int y) {

        System.out.println("How are you");

    }

    public static void main(String[] args) {

        A ob = new A();

    }
}

输出是:

How are you
Hello
Hi

为什么在print执行后this()语句没有执行?

3 个答案:

答案 0 :(得分:2)

  

但是当我在Demo类中包含this()时,输出如下

如果在以下构造函数中包含this()

public Demo() {
    this (0,null);
    System.out.println("ChildClass Constructor Called!!!");
}

您正在调用第二个演示构造函数Demo(int id , String name),该构造函数调用另一个Animal构造函数 - Animal(String name)(因为它包含super(name)而不是super()) - 这不会打印任何东西。

因此,您获得的唯一输出是:

ChildClass Constructor Called!!!
0 null
  

没有调用超类构造函数?是什么原因?

调用超类构造函数(必须调用某些超类构造函数),而不是你期望的那个。

答案 1 :(得分:0)

当你使用this()时,它意味着你正在调用当前(自我)类构造函数。

ChildClass Constructor Called!!!
0 null

你的回答预测你在Demo类构造函数中调用了这个(0,null),如。

public Demo() {
this (0,null);
System.out.println("ChildClass Constructor Called!!!");
}

此代码表示您正在调用Demo类Constructor,它接受两个参数并调用

public Demo(int id , String name){

super(name);
this.id = id;
}

上面的constructor.now上面的构造函数有super(name)意味着调用超类构造函数,它接受一个String类型的参数。

Animal(String name){
this.name = name;
}

因此未调用Animal类的默认构造函数。

永远记住,super()基于参数调用父类构造函数,并根据参数调用this()子类构造函数。

答案 2 :(得分:-1)

你有没有尝试过?

  public Demo(){
    super();

    System.out.println("ChildClass Constructor Called!!!");
}

这是因为您正在为Demo类定义默认构造函数。