Java构造函数变量被忽略
我正在尝试创建对象Iset的实例。当人们创建对象时,他们必须给出一个int,它的大小将是一个布尔数组,该数组将存储一组整数,例如1将是Iset[1]=true等等。但我不断得到索引超出范围的错误。程序的其余部分显然忽略了我在构造函数中设置的值,那么如何确保我在构造函数中使用的值在我的所有方法中都被使用呢 守则第一部分:Java构造函数变量被忽略,java,Java,我正在尝试创建对象Iset的实例。当人们创建对象时,他们必须给出一个int,它的大小将是一个布尔数组,该数组将存储一组整数,例如1将是Iset[1]=true等等。但我不断得到索引超出范围的错误。程序的其余部分显然忽略了我在构造函数中设置的值,那么如何确保我在构造函数中使用的值在我的所有方法中都被使用呢 守则第一部分: public class Iset { public int size; boolean[] Iset; ISet(int a) {
public class Iset {
public int size;
boolean[] Iset;
ISet(int a) {
int size = a;
seti = new boolean[size];
您正在构造函数中创建一个新变量,这称为阴影。使用
此
设置当前对象的属性:
this.size = a;
您正在构造函数中创建一个新变量,这称为阴影。使用
此
设置当前对象的属性:
this.size = a;
您正在构造函数中创建一个新的
int
变量。相反,您只需要执行this.size=a构造函数中的code>。您正在构造函数中创建一个新的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];
试试这个:
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];
如果要在另一个类中实例化构造函数,则应使用this
关键字,使构造函数成为公共的:
public class ISet {
public int size;
boolean[] iSet;
public ISet(int a) {
this.size = a;
this.iSet = new boolean[a];
}
如果要在另一个类中实例化构造函数,则应使用this
关键字,使构造函数成为公共的:
public class ISet {
public int size;
boolean[] iSet;
public ISet(int a) {
this.size = a;
this.iSet = new boolean[a];
}
size
构造函数中的变量是局部变量,这就是为什么其他成员方法无法获得正确的大小进行检查的原因
将值指定给此.size
,则它将工作:
ISet(int a) {
this.size = a;
seti = new boolean[size];
size
构造函数中的变量是局部变量,这就是为什么其他成员方法无法获得正确的大小进行检查的原因
将值指定给此.size
,则它将工作:
ISet(int a) {
this.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.
在这里,我们使用这个指针来引用大小,因为我们需要设置对象的大小变量,而不是局部变量大小让我们看看您的代码:
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.
这里我们使用这个指针来引用大小,因为我们需要设置对象的大小变量,而不是局部变量大小您没有正确初始化大小实例变量,而是初始化了一个局部变量大小。因此,您的大小实例变量仍然使用0初始化,而您的seti实例变量是一个空的数组,导致超出范围的错误。
正如其他人指出的,您不需要实例变量size
构造函数中也不需要另一个局部变量大小,只需使用seti.length来确定数组的大小。为了简化,您的代码应该是:
public class Iset {
boolean[] seti;
ISet(int a) {
seti = new boolean[a];
我建议您使用静态分析工具(如checkstyle)来消除代码中的此类错误。您没有正确初始化大小实例变量,而是初始化一个局部变量大小。因此,您的大小实例变量仍然使用0初始化,而您的seti实例变量是一个空的数组,导致超出范围的错误。
正如其他人指出的,您不需要实例变量size
构造函数中也不需要另一个局部变量大小,只需使用seti.length来确定数组的大小。为了简化,您的代码应该是:
public class Iset {
boolean[] seti;
ISet(int a) {
seti = new boolean[a];
我建议您使用诸如checkstyle之类的静态分析工具来消除代码中的此类错误。您的意思是
this.size=a
?您正在跟踪a变量。请使用更多可编译的代码。错误在哪里?您的代码可能有问题,但我们看得不够。您不需要保存大小,因为您总是可以从Iset.length
获取值。您的意思是this.size=a
?您正在隐藏a变量。请输入更多可编译的代码。错误在哪里?您的代码可能有错误,但我们没有看到足够的错误。您不需要保存大小,因为您总是可以从Iset.length
中获取值。它肯定会修复错误,但这并不能真正解释错误。不过,我不认为这会导致索引超出范围。