【发布时间】:2022-01-22 22:27:15
【问题描述】:
我正在尝试了解 this 和 super 在子类方法和子类构造函数中的用法:
超类:
public class Animal {
protected String name;
protected String age;
public Animal(String name, String age) {
this.name = name;
this.age = age;
}
}
子类方法中使用的this和super关键字:
public class Dog extends Animal {
public Dog(String name, String age) {
super(name, age);
}
public void display() {
this.name = "Doggy";
super.age = "20";
System.out.println(this.name + " is " + super.age + " years old");
}
}
上述案例中的“this”和“super”有什么区别?为什么在子类构造函数中我们不能使用"this"来初始化继承自超类的字段,如下例,但是我们可以使用super()来初始化超类中的相同字段?
public class Dog extends Animal {
public Dog(String name, String age) {
this.name = name;
this.age = age;
}
...
}
【问题讨论】:
-
FWIW,在您的“显示”方法中,您根本不需要
this或super。它们在该上下文中的作用是明确指定您正在谈论的对象(并且那里只有一个对象,尽管它由两个类定义定义)。 -
"在上述情况下,"this" 和 "super" 有什么区别?" 在你的情况下没有区别,因为你没有用 在您的子类中具有相同的名称。 “为什么在子类构造函数中我们不能使用“this”来初始化从超类继承的字段”我们可以,但这不是问题。这里的问题是构造函数中的第一条指令需要调用一些
super(..)。如果您希望编译器生成super(),则可以保留它,但由于您的超类没有无参数构造函数,您需要显式调用它。 -
Tldr,请“学习”docs.oracle.com/javase/specs/jls/se8/html/… (Ctrl+f, "this", "super")
标签: java constructor this super