使用方法后的Java结果不符合预期

时间:2016-03-20 20:53:33

标签: java

我有以下snipet代码:

class Phone {
    String phoneNumber = "123456789";
    void setNumber () {
        String phoneNumber;
        phoneNumber = "987654321";
    }
}
class TestPhone {
    public static void main(String[] args) {
        Phone p1 = new Phone();
        p1.setNumber();
        System.out.println (p1.phoneNumber);
    }
}

我期待“987654321”作为结果,但我得到“123456789” 就像方法setNumber没有任何效果一样 请有人帮我理解

4 个答案:

答案 0 :(得分:9)

您在方法中重新声明phoneNumber变量,遮蔽类中的字段,因此在阴影类字段中将看不到对局部变量所做的任何更改。不要这样做;摆脱重复变量声明,以便在该字段中看到方法中所做的更改。

例如,改变这个:

void setNumber () {
    String phoneNumber; // *** this is a local variable, visible ONLY in the method!
    phoneNumber = "987654321";  // this has no effect on the field
}

到此:

void setNumber () {
    // String phoneNumber;
    phoneNumber = "987654321"; // this will change the field!
}

答案 1 :(得分:2)

除了@Hovercraft Full Of Eels

void setNumber () {
    String phoneNumber; 
    phoneNumber = "987654321";  
    this.phoneNumber = "9876"; //this will change your field and give expected result
}

是保证设置字段值的另一种方法。

  

在long方法中,局部变量可以在没有的情况下遮蔽场   知道所以可能存在局部变量,总是使用this是一个   避免阴影的好点

答案 2 :(得分:0)

方法中的变量是阴影类变量...

这就是奇怪行为的原因......

答案 3 :(得分:0)

正如其他用户已经回答的那样,shadowing变量phoneNumbersetNumber方法的范围内再次声明

phoneNumber内的变量setNumber在其范围之外未知,而更改它不会影响声明为phoneNumber变量>班级成员。

这就是为什么明确地使用this引用班级成员是一个好习惯。

附注:尝试使用访问修饰符而不是让它裸露(no modifier具有类和包访问级别)。根据经验,始终从限制性最强的访问修饰符开始,并且只在必要时才展开它。