怀疑抽象课程

时间:2010-04-21 09:11:28

标签: java constructor abstract-class

public abstract class Person {

    private String name;

    public Person(String name) {
        this.name = name;
        System.out.println("Person");
    }

    public String getName() {
        return name;
    }

    abstract public String getDescription();    
}


public class Student extends Person {

    private String major;

    public Student(String name, String major) {
        super(name);
        this.major = major;
    }

    public String getMajor() {
        return major;
    }

    @Override
    public String getDescription() {
        return "student" + super.getName() + " having" + major;
    }

}

public class PersonTest {

    public static void main(String[] args) {

        Person person = new Student("XYZ", "ABC");
        System.out.println(person.getDescription());

    }

}

问:我们不能创建抽象类的对象,那么为什么调用Person构造函数,甚至是抽象类?

8 个答案:

答案 0 :(得分:2)

因为它仍然是一个类,它的构造函数作为对象实例化的一部分被调用。它是抽象的事实与此没有任何关系。

答案 1 :(得分:1)

您不能做的是创建抽象类的实例。 由于学生“部分”是一个人super(...)初始化学生的“人物部分”,因此不会创建一个人。

我希望你理解我试图说的话

答案 2 :(得分:1)

  

问题:我们无法创建对象   抽象类,然后为什么人   构造函数已被调用,甚至是它   一个抽象类?

如果一个类被声明为abstract,则不能创建该类的对象。 DOESNOT意味着你不能创建其子类的对象。

您可以让引用(类型为抽象类)引用子类(非抽象)对象。

  

人员=新学生(“XYZ”,   “ABC”);

为了构造一个Student对象,你需要初始化学生的“person”部分,这就是为什么要调用抽象超类的构造函数。

答案 3 :(得分:0)

构造函数只是一个像其他人一样的方法。并且您从子类的构造函数中明确地调用它:

super(name);

答案 4 :(得分:0)

从Student类调用Person构造函数。来自Java tutorials

  

抽象类是一个类   宣布抽象 - 它可能会也可能不会   包括抽象方法。抽象   类无法实例化,但是   它们可以被分类。

答案 5 :(得分:0)

抽象类可以有构造函数 - 它们不能直接调用,而只能作为构造子类实例的一部分,通过调用子类构造函数中的super()

答案 6 :(得分:0)

无法创建abstract class的实例,但子类可以调用super(name);。即使它是构造函数,它只是另一种方法。

答案 7 :(得分:0)

Abstract类是整个具体类的一部分。 Abstract类是一个允许将许多部分推迟到其具体实现的类,但它仍然必须初始化。

因此它有一个构造函数,因此构造函数具有设置自身所需的任何参数。

当您从Student类调用super(...)方法时,您将显式调用Person模板类中的构造函数。 super()调用必须位于Person构造函数的第一行,因此如果您的person类希望覆盖Person()构造函数设置的默认值,那么您就拥有该选项。但是当你扩展一个类(抽象或具体)时,必须调用一个人构造函数。