Java构造函数变量被忽略

时间:2014-02-10 08:34:42

标签: 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];

7 个答案:

答案 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这样的静态分析工具来消除代码中的错误。