所以我正在测试一些代码,这里是:
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
,我缺少什么?
答案 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)
//试试这个
公共类电话{
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);
}
}