Java:抽象类中的最终变量

时间:2011-07-02 15:14:52

标签: java constructor abstract final

在Java中,我无法创建抽象类的实例。那么为什么不对以下代码发出尖叫呢?

public abstract class FooType {
    private final int myvar;

    public FooType() {
        myvar = 1;
    }
}

5 个答案:

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

会产生错误。

相关问题