1

为什么我不能在子类中分配变量 i ?

class a {
   int i;
}


class b extends a {
   i=1;
}
4

4 回答 4

9

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

在这种情况下,构造函数可能是建立默认值(对于子类型)的合适位置:

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

正如 damo 建议的那样,初始化块也可以工作。这在初始化字段教程中进行了讨论:

通常,您会将用于初始化实例变量的代码放在构造函数中[但是] 使用构造函数初始化实例变量有两种选择:初始化块和最终方法。

于 2013-06-27T20:56:14.860 回答
1

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

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

这将在a constructor前后编译并执行b constructor

于 2013-06-27T21:31:00.913 回答
0

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

于 2013-06-27T21:02:14.320 回答
0
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;
}
}
于 2013-06-27T21:02:41.160 回答