inh*_*ler 1 java inheritance super
class Person {
public String name;
String id;
public Person() {
System.out.println("Parent default");
name = id = "";
}
public Person(String name, String id) {
System.out.println("Parent parameter");
this.name = name;
this.id = id;
}
void show() {
System.out.println(this.name + "\n" + this.id);
}
}
class Student extends Person {
Student() {}
Student(String a, String b) {
super(a, b);
}
}
class Main {
public static void main(String args[]) {
Person p = new Person("A", "AA");
Student s = new Student("b", "BB");
s.show();
}
}
Run Code Online (Sandbox Code Playgroud)
我对java很陌生,所以我想了解一些基本的东西,但我失败了。如果我从父类继承,这意味着我在子类中获得了父类的副本,对吗?所以,在这段代码中——如果我引用父类的show
方法(在 Main 类中),这应该显示父类name
和id
之前设置的。
但它没有显示——所以我的理解肯定有问题。如何从子类访问父类的副本?使用super
子构造函数中的方法?简而言之,我也想了解继承的基础知识。
考虑以下语句:
Person p = new Person("A", "AA");
Run Code Online (Sandbox Code Playgroud)
这是创建一个Person
. 它的名字是"A"
,它的 id 是"AA"
。
现在考虑这个陈述:
Student s = new Student("b", "BB");
Run Code Online (Sandbox Code Playgroud)
这是创建一个新的Student
. 它还创建了一个新的 Person
. 这怎么可能?那么一个Student
是一个Person
。这就是继承的意思。当一种类型扩展另一种类型时,即定义了类型之间的“是一个”关系。
狗扩展了动物,因为狗是动物。Car 扩展了 Vehicle,因为 Car 是 Vehicle。
因此,当您创建新Student
的Person
. Student extends Person
,所以 aStudent
是 a Person
。不足为奇,我可能会补充。
该super
关键字用于从其子类引用父类的方法和字段。在你的Student
构造函数中
Student(String a, String b) {
super(a, b);
}
Run Code Online (Sandbox Code Playgroud)
您实际上是Person
通过调用super(a, b)
. 所以new Student("b", "BB")
创建了一个Person
name"b"
和 id "BB"
。那Person
恰好也是一个Student
。
还有人之间没有真正的关系,任何"a"
与人"b"
(尽管他们或许是远房表亲)。如果你问别人"a"
她的名字,她会回答"a"
。如果你问"b"
他的名字,他会回答"b"
。一个人用别人的名字回复会有点奇怪,所以每个人都被视为完全不同的人。
另请参阅:Java 继承文档