2013-06-27 87 views

回答

9

您可以在子类中分配变量。你不能做的是把语句放在只允许声明的地方。 (注意:int i = 10;是一个声明 - 不声明。)

在这种情况下,构造很可能会建立一个默认值合适的地方(亚型):

class b extends a { 
    public b() { 
    i = 1; 
    } 
} 

由于DAMO建议,一个初始化块也可以工作。这在Initializing Fields tutorial讨论:

通常情况下,你干脆把代码在构造函数中初始化实例变量,[但]有两种选择使用构造函数初始化实例变量:初始化块和最终方法。

+0

...是一个声明 - 不是一个声明。我认为这叫做声明声明。大声笑 –

+0

@ su-我没有在这里使用精确的JLS支持的术语,很好的情况是这样;问题的关键在于语言语法层面上的区别,根据具体情况允许(或禁止)不同的产品。 – user2246674

+0

这很好:)我明白了。 –

0

当你使用的是默认的访问修饰符,这意味着在a类的属性是同一个包中的所有类,包括子类b访问。但是,您必须在方法中访问该属性。

0
class a { 
    int i; // this is an instance variable 
} 

实例变量是一类级别,它们可以被分配到文字或引用变量,或者你可以把它有它的默认值,子类可以使用公共实例里面的方法或构造不在一流的水平,你做的事:

class b extends a { 
i = 3; // assgining a literal to i is compilation error 
} 

,因为它是类字段和实例变量声明,没有什么分配超类的实例变量的位置。

如果您想在类a中使用i,您必须在某个方法或构造函数中使用它。

class b extends a { 
a(){ 
    i = 4; 
} 

void doSomething(){ 
i = 5; 
} 
} 
1

所有的答案是正确的,但没有一个人说,你可以做到这一点..

class b extends a { 
    { 
    i=1; 
    } 
} 

,这将编译和执行是后a constructor之前b constructor

相关问题