我正在尝试创建对象Iset的实例。当人创建对象时,他们必须给出一个int,它将是一个布尔数组的大小,它将存储一组整数,例如1将是Iset [1] = true等等。但是我不断得到索引超出范围错误。程序的其余部分显然忽略了我在构造函数中设置的值,那么如何确保在我的所有方法中使用构造函数中使用的值?
代码的第一部分:
public class Iset {
public int size;
boolean[] Iset;
ISet(int a) {
int size = a;
seti = new boolean[size];
答案 0 :(得分:2)
让我们看看你的代码:
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 指针来引用大小,因为我们需要设置对象的大小变量而不是局部变量大小。
答案 1 :(得分:1)
您正在构造函数中创建一个新变量,这称为 shadowing 。使用this
设置当前对象的属性:
this.size = a;
答案 2 :(得分:1)
您正在构造函数中创建一个新的int
变量。相反,您只需要在构造函数中执行this.size = a;
。
答案 3 :(得分:0)
试试这个:
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];
答案 4 :(得分:0)
如果你想在另一个类中实例化它,你应该使用this
关键字,使构造函数公开:
public class ISet {
public int size;
boolean[] iSet;
public ISet(int a) {
this.size = a;
this.iSet = new boolean[a];
}
答案 5 :(得分:0)
size
变量是一个局部变量,这就是为什么其他成员方法无法检查正确的大小的原因。
将值分配给this.size
,然后它将起作用:
ISet(int a) {
this.size = a;
seti = new boolean[size];
答案 6 :(得分:0)
您没有正确初始化大小实例变量,而是初始化本地变量大小。因此,大小实例变量仍然使用 0 进行初始化, seti实例变量是一个空数组,导致范围错误。
正如其他人所指出的,您不需要实例变量大小。
在构造函数中也不需要另一个局部变量大小,只需使用 seti.length 来确定数组的大小。为简化起见,您的代码应为:
public class Iset {
boolean[] seti;
ISet(int a) {
seti = new boolean[a];
我建议您使用像checkstyle这样的静态分析工具来消除代码中的错误。