为什么我不能在子类中分配变量 i ?
class a {
int i;
}
class b extends a {
i=1;
}
您可以在子类中分配变量。你不能做的是将语句放在只允许声明的地方。(请注意,这int i = 10;
是一个声明 - 不是声明。)
在这种情况下,构造函数可能是建立默认值(对于子类型)的合适位置:
class b extends a {
public b () {
i = 1;
}
}
正如 damo 建议的那样,初始化块也可以工作。这在初始化字段教程中进行了讨论:
通常,您会将用于初始化实例变量的代码放在构造函数中[但是] 使用构造函数初始化实例变量有两种选择:初始化块和最终方法。
所有答案都是正确的,但没有人说你可以做到这一点..
class b extends a {
{
i=1;
}
}
这将在a constructor
前后编译并执行b constructor
当您使用默认访问修饰符时,这意味着a
同一包中的所有类都可以访问 class 中的属性,包括 subclass b
。但是,您必须在方法中访问该属性。
class a {
int i; // this is an instance variable
}
实例变量是类级别,它们可以分配给文字或引用变量,或者您可以将其保留为默认值,子类可以使用其方法或构造函数中的公共实例,而不是像您所做的那样在类级别:
class b extends a {
i = 3; // assgining a literal to i is compilation error
}
因为它是 Class 字段和 Instance 变量声明的位置,而不是将超类的实例变量分配给某物。
如果要i
在类 a 中使用,则必须在某个方法或构造函数中使用它。
class b extends a {
a(){
i = 4;
}
void doSomething(){
i = 5;
}
}