我有一个课程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()
语句没有执行?
答案 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类定义默认构造函数。