为什么我不能在子类中分配变量i?
class a {
int i;
}
class b extends a {
i=1;
}
答案 0 :(得分:9)
您可以在子类中指定变量。你不能做的是将语句放在只允许声明的地方。 (请注意,int i = 10;
是一个声明 - 而不是声明。)
在这种情况下,构造函数可能是建立默认值(适用于子类型)的合适位置:
class b extends a {
public b () {
i = 1;
}
}
正如达摩所说,初始化块也可以。这在Initializing Fields tutorial中讨论:
通常情况下,您可以使用代码在构造函数中初始化实例变量 [但]使用构造函数初始化实例变量有两种选择:初始化程序块和最终方法。
答案 1 :(得分:1)
所有答案都是正确的,但没有人说你可以这样做..
class b extends a {
{
i=1;
}
}
这将编译并在a constructor
之后和b constructor
之前执行
答案 2 :(得分:0)
当您使用默认访问修饰符时,这意味着同一个包中的所有类都可以访问类a
中的属性,包括子类b
。但是,您必须在方法中访问该属性。
答案 3 :(得分: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;
}
}