忽略Java构造函数变量

我正在尝试创建对象Iset的实例。 当人创建对象时,他们必须给出一个int,它将是一个布尔数组的大小,它将存储一组整数,例如1将是Iset [1] = true等等。但是我一直得到索引超出范围错误。 程序的其余部分显然忽略了我在构造函数中设置的值,那么如何确保在我的所有方法中使用构造函数中使用的值?

代码的第一部分:

public class Iset { public int size; boolean[] Iset; ISet(int a) { int size = a; seti = new boolean[size]; 

让我们来看看你的代码:

  public class Iset { public int size;// Declares a Member of a class and all the objects will have a copy of this member boolean[] Iset; ..... } ISet(int a) { int size = a; //This line is declaring a **local variable** called size seti = new boolean[size]; ... } 

在构造函数中查看您已创建局部变量size但您的类中也有一个名为size的类成员。 因此,在这种情况下,每当我们尝试在构造函数中设置size变量时,就会发生与编译器的冲突,无论是设置局部变量还是类成员(这种冲突是因为局部变量和类成员都具有相同的名称)。 在这种情况下,编译器选择本地变量大小而不是类成员大小 。 但是为了确保在我的所有方法中使用在构造函数中使用的值, 您必须设置类成员 。 要设置类成员,我们使用以下代码:

 this.size = a;//Says set the object member size to value present in a. 

这里我们使用this指针引用大小, 因为我们需要设置对象的大小变量而不是局部变量大小

您正在构造函数中创建一个新变量,这称为阴影 。 使用this设置当前对象的属性:

 this.size = a; 

您正在构造函数中创建一个新的int变量。 相反,你只需要做this.size = a; 在构造函数中。

尝试这个:

 public class Iset { public int size; boolean[] seti; ISet(int a) { this.size = a; // This will make methods access the value this.seti = new boolean[size]; 

构造函数中的size变量是一个局部变量,这就是为什么其他成员方法无法获得正确的大小来检查。

将值分配给this.size ,然后它将工作:

 ISet(int a) { this.size = a; seti = new boolean[size]; 

您应该使用this关键字,如果要在另一个类中实例化它,请将构造函数设置为public

 public class ISet { public int size; boolean[] iSet; public ISet(int a) { this.size = a; this.iSet = new boolean[a]; } 

您没有正确初始化size实例变量 ,而是初始化本地变量大小 。 因此,您的size实例变量保持初始化为0,并且您的seti实例变量是一个数组,导致超出范围错误。

正如其他人所指出的,您不需要实例变量大小。
在构造函数中也不需要另一个局部变量大小,只需使用seti.length来确定数组的大小。 为简化起见,您的代码应该是:

 public class Iset { boolean[] seti; ISet(int a) { seti = new boolean[a]; 

我建议您使用像checkstyle这样的静态分析工具来消除代码中的错误。