我有一个abstract
超类,它有一个protected String
变量。它没有在超类中初始化。
我想做的就是初始化并在子类中使用它。所以,我有这样的事情:
public class MySubclass extends MyAbstractSuperclass {
thing = "i'm a thing";
[...]
}
看起来很简单,因为整个继承点是在不同的上下文中重用类及其字段。但这是错误的:Syntax error on token "thing", VariableDeclaratorId expected after this token
。
我可以通过在子类初始化周围加上括号来编译它。我想知道的是为什么第一种方法是错误的,以及为什么括号修复它。谢谢你的帮助。
编辑:我很感激通过使用构造函数来解决这个问题的提示。但是,我仍然很好奇以这种方式使用超类字段实际上有什么问题,因为在我看来它非常直观。而且,为什么括号会修复它,用括号之类的括号来围绕声明究竟是什么意思呢?循环结构?
答案 0 :(得分:3)
这不是Scala,你必须写一个显式的构造函数:
public class MySubclass extends MyAbstractSuperclass {
public MySubclass() {
thing = "i'm a thing";
[...]
}
}
或使用带参数的构造函数:
public abstract class MyAbstractSuperclass {
protected final String thing;
protected MyAbstractSuperclass(String thing) {
this.thing = thing;
}
}
public class MySubclass extends MyAbstractSuperclass {
public MySubclass() {
super("i'm a thing");
}
}
答案 1 :(得分:1)
我想知道的是为什么第一种方法是错误的,以及为什么括号修复它。谢谢你的帮助。
public class MySubclass extends MyAbstractSuperclass {
thing = "i'm a thing";
[...]
}
您尝试在此处执行语句,将变量thing
的值设置为text。你不能在这里做声明,你只能在这里做变量声明。
public class MySubclass extends MyAbstractSuperclass {
{
thing = "i'm a thing";
}
[...]
}
现在,您有一个初始化块,这个块作为语句执行(在构造函数之前)。因此,您可以访问thing
,因为可见性受到保护。例如,请参见:http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
答案 2 :(得分:0)
public class MySubclass extends MyAbstractSuperclass {
public MySubclass(){
super.thing= "i'm a thing";
}
}