用子类的类型或其父类的类型创建子类对象

t3rrh42d2

假设我有一个名为Person的超类,该类具有私有实例变量的名称和年龄,以及一个名为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);

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

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

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

以上都是有效的,您不必重写任何代码。(假设姓名,年龄和学校是正确的类型,等等。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用子类型初始化父类中的对象

超类类型对象的子类的构造方法?

如何基于超类型的对象创建子类型的对象?

扩展类型以创建子类型

在数组中创建Java中超类类型的子类对象

如何定义“类的子类”类型?

实现函子类型类

动态创建的子类的类型注释

超类类型的对象无法访问子类的方法

将对象定义为通用密封类的子类型?

Swift:从超类返回子类类型的对象数组

C ++子类与它们自己的类型及其父类是否相同?

创建 2 个相同的不同子类型的类

将类的子类作为类型参数传递(类型参数是子类)

从原始字节创建正确子类型的对象实例

如何从父方法创建子类型的新对象

将子类中的对象放入超类类型的数组后如何调用子类方法?

是否创建子类的实例,在 Java 中创建其父类的实例

对象在动态类型创建期间被子类化,但在python2中的经典类定义期间不被子类化

在C ++中先验未知子类类型的模型类/子类

如何创建子类,以便参数在Java中属于子类类型

Swift子类复杂子类型

Kotlin类型,子类型和超类型与类,子类和超类

如何从 Python 中现有的超类类型对象实例化子类类型变量

通过抽象类类型变量还是子类类型变量引用子对象?

如何检查类型是子类型还是对象的类型?

如何在Kotlin中使用返回带有类型参数的子类型的方法创建类?

Java反思:获取类而不是子类型

Java包装器类的具体类型的子类