假设我有一个名为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] 删除。
我来说两句