局部变量和实例变量。 Java的

时间:2014-12-20 18:39:24

标签: java instance-variables local-variables

所以我正在测试一些代码,这里是:

public class Phone {

    String phoneNumber = "1234";

    void setNumber(){
        String phoneNumber;
        phoneNumber = "4321";
    }
}

public class TestPhone {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Phone p1 = new Phone();
        p1.setNumber();
        System.out.println(p1.phoneNumber);
    }

}

输出:

  

1234

为什么不4321?我致电setNumber,因此应将phoneNumber分配给4321,我缺少什么?

10 个答案:

答案 0 :(得分:5)

局部变量phoneNumber以实际名称隐藏实例变量。

void setNumber(){
    String phoneNumber;
    phoneNumber = "4321";
}

因此,此代码设置局部变量,不会更改实例变量。

如果您想更改实例变量,则必须消除歧义, 使用this.前缀,如下所示:

void setNumber(){
    String phoneNumber;
    this.phoneNumber = "4321";
}

......或者更好的是,只需完全删除无意义的局部变量......(就像你说@RobP一样!)

答案 1 :(得分:1)

这是因为您实际上正在打印类phoneNumber中定义的proterty Phone的值。 phoneNumber方法中的setNumber只是一个局部变量。

如果要修改属性的值,可以执行以下操作:

phoneNumber = 1214728;

this.phoneNumber = 1214728;

没有使用以下语句定义局部变量:

String phoneNumber; // this creates a local variable, you don't want to modify this local variable, but the property!

答案 2 :(得分:1)

默认情况下,首选项将赋予具有相同名称的局部变量。所以在方法setNumber中,string phoneNumber是一个新的局部变量,它不是实例变量而是更新的。要更新实例变量,请使用此关键字

这样的东西

this.phoneNumber = 4321

答案 3 :(得分:1)

问题出在这里。

String phoneNumber = "1234";

void setNumber(){
    String phoneNumber;
    phoneNumber = "4321";
}

在setNumber函数中创建第二个String phoneNumber时,它会使用局部变量覆盖该函数中的第一个。要解决此问题,您要么想要将变量重命名为不同或使用此访问器,要么只是删除本地变量,例如:

String phoneNumber = "1234";

void setNumber(){
    this.phoneNumber = "4321";
}

或者

String phoneNumber = "1234";

void setNumber(String newPhoneNumber) {
    phoneNumber = newPhoneNumber;
}

p1.setNumber("4321");

答案 4 :(得分:1)

在方法setNumber中,您宣布一个名为phoneNumber的新变量,然后为其指定值" 4321"。案件类似于

void setNumber(){
    String foo;
    foo = "4321";
}

您可以使用正确的变量或在变量名称

之前使用this来更正方法
void setNumber(){
    phoneNumber = "4321"; // this.phoneNumber = "4321"
}

答案 5 :(得分:1)

因为您只打印实例变量的值,然后在方法内部声明了一个单独的变量,也称为局部变量。

如果要更改实例变量的值,该变量是在方法之外的phoneNumber =“1234”。

在Method setNumber()中,删除Local变量声明,使用“this”关键字引用phoneNumber属性对其进行更改。

void setNumber() {
this.phoneNumber = "4321"
}

在这种情况下,方法setNumber()在被对象调用时,他会将phoneNumber变量的当前值从“1234”更改为“4321”。

答案 6 :(得分:0)

代码String phoneNumber; 声明一个新的变量引用,它与您的全局变量不同。此局部变量 phoneNumber的范围仅存在于函数之前,并且只能在函数内使用。

因此,当您尝试更改值时,您的全局变量指定的引用从未实际修改过。

对此的简单修复是通过this.phoneNumber引用全局变量或仅删除新的变量声明。

答案 7 :(得分:0)

在你的setNumber方法中,电话号码是本地的。

//试试这个

公共类电话{

String phoneNumber = "1234";

void setNumber(){
this.phoneNumber = "4321";
}

}

公共类TestPhone {

public static void main(String[] args) {

Phone p1 = new Phone();
p1.setNumber();
System.out.println(p1.phoneNumber);
}

}

答案 8 :(得分:0)

你在方法中做的是遮蔽类的属性。在赋值时,值 4321 在属性上的局部变量a 上设置。这样,局部变量隐藏了属性的变量。当方法返回时,局部变量超出范围并标记为销毁,而不再隐藏属性。

main 中,您将打印出属性值,尽管有此调用,该值仍未改变。

答案 9 :(得分:0)

当您声明实例变量并再次声明为局部变量时,它们被视为不同的变量。要使您的代码能够正常运行,请执行以下操作。

public class Phone {

String phoneNumber = "1234";

void setNumber(){

    this.phoneNumber = "4321";
}

}

公共类TestPhone {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Phone p1 = new Phone();
    p1.setNumber();
    System.out.println(p1.phoneNumber);
}

}