2013-02-04 48 views
0

我有一个abstract超类,它有一个protected String变量。它不在超类中初始化。引用子类中的抽象超类字段

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

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

似乎很简单,因为继承的全部意义在于重复使用在不同的上下文类和农田。但是这是错误的:Syntax error on token "thing", VariableDeclaratorId expected after this token

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

编辑:我很欣赏提示,我可以通过使用构造函数来解决此问题。然而,我仍然很好奇以这种方式使用超类字段的真正问题,因为在我看来,它非常直观。另外,为什么大括号可以修正它,用括号括起来的意思是什么意思?一个循环结构?

+1

大括号创建一个[实例初始值设定项](http://stackoverflow.com/questions/6763550/why-java-instance-initializers) – GriffeyDog

回答

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

2

这不是斯卡拉,你必须写一个明确的构造函数:

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"); 
    } 
} 
+0

嗯,我可以做到这一点。但是如果我把大括号放在它的周围,它会编译,为什么?我明白为什么一个构造函数的作品。但是我从来没有看过像这样的陈述的大括号,没有提及任何类型的关键字。 – aearon

+1

@aearon请参阅:http://stackoverflow.com/questions/2007666和http://stackoverflow.com/questions/1958636 –

0
public class MySubclass extends MyAbstractSuperclass {   

     public MySubclass(){ 
     super.thing= "i'm a thing"; 
     } 
    }