可能重复:
Why do abstract classes in Java have constructors?
abstract class constructors?
我们知道抽象类不能被实例化,但另一方面它可以有构造函数。请解释为什么抽象类可以有一个构造函数?编译器如何处理这种情况?
答案 0 :(得分:1)
抽象类的构造函数用于初始化抽象类的数据成员。它永远不会直接调用,编译器也不会允许它。它总是作为具体子类的实例化的一部分被调用。
例如,考虑一个Animal抽象类:
class Animal {
private int lifeExpectency;
private String name;
private boolean domestic;
public Animal(String name, int lifeExpectancy, boolean domestic) {
this.lifeExpectency = lifeExpectancy;
this.name = name;
this.domestic = domestic;
}
public int getLifeExpectency() {
return lifeExpectency;
}
public String getName() {
return name;
}
public boolean isDomestic() {
return domestic;
}
}
本课程负责处理所有基本的动物属性。 它的构造函数将由子类使用,例如:
class Cat extends Animal {
public Cat(String name) {
super(name, 13, true);
}
public void groom() {
}
}
答案 1 :(得分:0)
这可能不是最好的解释,但在这里。抽象类与接口非常相似,但也可以提供实现。从抽象类继承的类也继承已实现的函数,并且根据语言,您可以根据需要覆盖默认实现。
答案 2 :(得分:0)
假设您有抽象类A:
abstract class A {
private int x;
public A(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
注意,设置x的唯一方法是通过构造函数,然后它变为不可变的
现在我有B级扩展A:
class B extends A {
private int y;
public B(int x, int y) {
super(x);
this.y = y;
}
public int getY() {
return y;
}
}
现在B也可以通过使用super(x)来设置x,但它具有不可变属性y。
但是你不能调用new A(5)
因为类是抽象的你需要使用B或任何其他子类。
答案 3 :(得分:-3)
抽象类可以具有可以在派生类中调用的构造函数。因此通常构造函数在抽象类中被标记为受保护。