我有一个具有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

07-24 19:02
查看更多