从其子类的实例访问超类的属性

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 类中),这应该显示父类nameid之前设置的。

但它没有显示——所以我的理解肯定有问题。如何从子类访问父类的副本?使用super子构造函数中的方法?简而言之,我也想了解继承的基础知识。

nbr*_*oks 5

考虑以下语句:

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。

因此,当您创建新StudentPerson. 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")创建了一个Personname"b"和 id "BB"。那Person恰好也是一个Student

还有人之间没有真正的关系,任何"a"与人"b"(尽管他们或许是远房表亲)。如果你问别人"a"她的名字,她会回答"a"。如果你问"b"他的名字,他会回答"b"。一个人用别人的名字回复会有点奇怪,所以每个人都被视为完全不同的人。


另请参阅:Java 继承文档