我试过这个:
class protectedfinal
{
static abstract class A
{
protected final Object a;
}
static class B extends A
{
{ a = new Integer(42); }
}
public static void main (String[] args)
{
B b = new B();
}
}
但我得到了这个错误:
protectedfinal.java:12: error: cannot assign a value to final variable a
{ a = new Integer(42); }
^
1 error
如何解决这个问题?
有些人在这里建议使用构造函数,但这仅在某些情况下有效。它适用于大多数对象,但无法从构造函数中引用对象本身。
static abstract class X
{
protected final Object x;
X (Object x) { this.x = x; }
}
static class Y extends X
{
Y () { super (new Integer(42)); }
}
static class Z extends X
{
Z () { super (this); }
}
这是错误:
protectedfinal.java:28: error: cannot reference this before supertype constructor has been called
Z () { super (this); }
^
有人可能会争辩说,存储这种引用没有多大意义,因为this
已经存在。没错,但这是this
在构造函数中使用的任何使用都会出现的一般问题。无法传递this
给任何其他对象以将其存储在最终变量中。
static class Z extends X
{
Z () { super (new Any (this)); }
}
那么如何编写一个抽象类,强制所有子类都有一个最终成员,该成员在子类中初始化?