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构造函数,甚至是抽象类?
答案 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()构造函数设置的默认值,那么您就拥有该选项。但是当你扩展一个类(抽象或具体)时,必须调用一个人构造函数。