Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用子类';s类型或其超类';s型_Java_Inheritance_Polymorphism - Fatal编程技术网

Java 使用子类';s类型或其超类';s型

Java 使用子类';s类型或其超类';s型,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,假设我有一个名为Person的超类,带有私有实例变量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

假设我有一个名为Person的超类,带有私有实例变量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;
    }
我的子构造函数是:

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);

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

您可能希望将引用类型设置为
,原因如下。一般来说,它更抽象,在编码和阅读代码时需要更少的思考

  • 您的代码的未来读者不必想知道为什么类型必须是
    Student
    ,他们可能会思考并花费太多时间试图弄清楚是否使用了
    Student
    特定操作,或者为什么没有
  • 它限制了编码时操作/字段的数量,因此可以查看和调用的内容的复杂性更低。因此,调用错误方法的可能性较小,您需要的只是可用的方法
  • 您以后可能需要更改
    Person
    实例的子类(例如,如果您引入了
    Teacher extensed Person
    ),并且如果您选择将变量声明为
    Person
    ,那么您肯定知道除了实例化之外,不需要更改任何其他代码行,因为您没有调用任何在
    Student
    中重新定义/重写/包装的等效方法(如果存在此类方法,我认为这通常是一个糟糕的设计,但这是可能的)

看起来你的解释很好也很有趣,但如果你能以更好的方式格式化它,那么它会非常棒。以更可读的方式格式化它,这一行是什么意思?“排序方法您认为不需要对任何其他内容进行排序”您仍然可以向列表中添加一个声明为学生的引用。我不认为问题在于为什么有人会使用继承或者它的好处是什么,但是为什么有人会将实例的类型声明为某个父类型而不是实际的实例类型。正如常见的问题一样,为什么要将列表声明为
list myList=…
而不是
ArrayList myList=…