引用子类中的抽象超类字段

时间:2013-02-04 20:35:40

标签: java inheritance initialization

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

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

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

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

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

编辑:我很感激通过使用构造函数来解决这个问题的提示。但是,我仍然很好奇以这种方式使用超类字段实际上有什么问题,因为在我看来它非常直观。而且,为什么括号会修复它,用括号之类的括号来围绕声明究竟是什么意思呢?循环结构?

3 个答案:

答案 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";
         }
    }