java - 使用子类的类型或其父类(super class)的类型创建子类对象

标签 java inheritance polymorphism

假设我有一个名为 Person 的父类(super class),带有私有(private)实例变量 name 和age,还有一个名为 Student 的子类,它添加了一个名为 school 的实例变量。 我的父构造函数是:

public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

我的子构造函数是:

public Student(String name, int age, String school) {
        super(name, age);
        this.school = school;
    }

我可以通过以下方式使用 Student 构造函数创建一个对象:

Student test = new Student("Joe", 20, "StackOverflow");
Person test = new Student("Joe", 20, "StackOverflow");

我不确定在这种情况下或在一般情况下有什么区别,或者是否比另一个具有某些优势。

最佳答案

在这样的小程序中,很难看到继承的好处,特别是以同样的方式创建学生和个人的能力。

但是,请想一想,您有一个排序算法,可以对“Person”类型进行排序,并且仅对该类型进行排序。

Person p = new Person(name, age);
ArrayList<Person> list = new ArrayList<Person>();

Sort(list);

其中排序方法仅采用 Person 类型的列表。

后来您意识到能够对学生进行排序会很好,但您不想重写排序算法。由于您的排序算法仅针对“人”类型进行编码,因此您现在可以将学生传递进去,但包含在人中。您还可以重写比较方法,以不同的方式对学生进行分类。这是一个简单的例子,还有更多。

Person s = new Student(name, age, school);
list.add(s);
Sort(list);

以上内容均有效,您无需重写代码。 (假设姓名、年龄和学校是正确的类型等......)。

关于java - 使用子类的类型或其父类(super class)的类型创建子类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598884/

相关文章:

android - 如何正确构造带有继承的房间实体

c++ - 从纯抽象基类继承 typedef

java - java中字符代码0的正则表达式

java - 如何将我的方法更改为通用方法?

c# - 在抽象父类(super class)的子类中强制使用属性

c++ - 为什么编译器会提示我的 dynamic_cast?

c++ - TwoDimensionalShape 类应该包含什么?

c++ - 访问映射中元素的成员,其值为 C++ 中的抽象基类

java - 运行任何新的 Android 项目时出现问题 - 未找到默认 Activity/无效的 Java 包

java - @WebService 注释不适用于 Weblogic 10.3