在Java中,我无法创建抽象类的实例。那么为什么不对以下代码发出尖叫呢?
public abstract class FooType {
private final int myvar;
public FooType() {
myvar = 1;
}
}
答案 0 :(得分:16)
代码很好,最终变量在FooType
的构造函数中初始化。
您无法实例化FooType
,因为它是抽象的。但是如果你创建一个FooType
的非抽象子类,那么将调用构造函数。
如果在构造函数中没有显式调用super(...)
,Java编译器将自动添加它。因此,确保调用继承链中每个类的构造函数。
答案 1 :(得分:3)
您可以在非抽象类中拥有抽象类中的构造函数,方法,属性和所有内容。你无法实例化这个类。所以这段代码没有任何问题。
在派生类中,您可以调用构造函数并设置最终属性:
public class Foo extends FooType
{
public Foo()
{
super(); // <-- Call constructor of FooType
}
}
如果你没有指定对super()的调用,那么编译器无论如何都会插入它。
答案 2 :(得分:0)
你可以创建FooType的具体子类,它们都有一个名为myvar的最终字段。
BTW:抽象类中的public
构造函数与protected
构造函数相同,因为它只能从子类中调用。
你有什么疑问?
答案 3 :(得分:0)
确定。看,抽象类可以有一个构造函数。它始终存在 - 隐含或明确。实际上,当您创建抽象类的子类的对象时,子类的构造函数所做的第一件事就是使用super()来调用其抽象超类的构造函数。只是理解,这就是为什么除非使用参数化构造函数,否则不必显式写super()
。即使它是抽象的,每个类都有一个你无法看到的隐式构造函数。除非你创建自己的构造函数,否则调用它。很久你创建了抽象类而没有在其中创建任何自定义构造函数,所以你不知道隐式构造函数的存在。
答案 4 :(得分:0)
不,你不能在Abstract类中声明最终变量。 检查下面的例子。
public abstract class AbstractEx {
final int x=10;
public abstract void AbstractEx();
}
public class newClass extends AbstractEx{
public void AbstractEx(){
System.out.println("abc");
}
}
public class declareClass{
public static void main(String[] args) {
AbstractEx obj = new newClass ();
obj.AbstractEx();
// System.out.println(x);
}
}
此代码运行正确并以
生成输出ABC
但是如果我们删除
的评论符号的System.out.println(X);
会产生错误。