我有一个具有abstract
变量的protected String
超类。它没有在超类中初始化。
我要做的就是初始化并在子类中使用它。所以,我有这样的事情:
public class MySubclass extends MyAbstractSuperclass {
thing = "i'm a thing";
[...]
}
看起来很简单,因为继承的重点是在不同的上下文中重用类及其字段。但这是错误的:
Syntax error on token "thing", VariableDeclaratorId expected after this token
。我可以通过将子类初始化放在方括号内来进行编译。我想知道的是为什么第一种方法是错误的,以及为什么要用括号括起来。谢谢你的帮助。
编辑:我很感谢我可以通过使用构造函数来解决此问题的提示。但是,我仍然对以这种方式使用超类字段到底有什么问题感到好奇,因为在我看来这很直观。而且,为什么花括号要修复它,用诸如括号之类的花括号包围一个语句的确切含义是什么?循环结构?
最佳答案
我想知道的是为什么第一种方法是错误的,以及为什么要用括号括起来。谢谢你的帮助。
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