1

我有一个有变量的abstract超类。protected String它没有在超类中初始化。

我要做的就是初始化并在子类中使用它。所以,我有这样的事情:

    public class MySubclass extends MyAbstractSuperclass {        
        thing = "i'm a thing";
        [...]
    }

看起来很简单,因为继承的重点是在不同的上下文中重用类及其字段。但这是错误的:Syntax error on token "thing", VariableDeclaratorId expected after this token.

我可以通过在子类初始化周围加上括号来编译它。我想知道的是为什么第一种方法是错误的,以及为什么括号可以解决它。谢谢你的帮助。

编辑:我很欣赏我可以通过使用构造函数来解决这个问题的提示。但是,我仍然很好奇以这种方式使用超类字段实际上有什么问题,因为在我看来这很直观。而且,为什么大括号会修复它,在循环结构之外用大括号包围语句到底意味着什么?

4

3 回答 3

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");
    }
}
于 2013-02-04T20:37:01.663 回答
1

我想知道的是为什么第一种方法是错误的,以及为什么括号可以解决它。谢谢你的帮助。

public class MySubclass extends MyAbstractSuperclass {        
    thing = "i'm a thing";
    [...]
}

你尝试在这里做一个语句,将变量的值设置thing为文本。你不能在这里做声明,你只能在这里做变量声明。

public class MySubclass extends MyAbstractSuperclass { 
    {       
        thing = "i'm a thing";
    }
    [...]
}

现在,您有一个初始化程序块,它作为语句执行(在构造函数之前)。因此,您可以访问thing,因为可见性受到保护。例如,请参见此处:http ://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

于 2013-02-04T20:46:50.393 回答
0
public class MySubclass extends MyAbstractSuperclass {        

        public MySubclass(){
         super.thing= "i'm a thing";
         }
    }
于 2013-02-04T20:38:21.967 回答