我编写了我的代码,但现在我正在尝试更改以查看正在发生的事情。
在对象类字段中,
static final String msg="here";
在同一个物体中,在一个methot
public void givemessage(int no)
{
System.out.println("look.");
System.out.println(msg);
}
这里,当我从main打电话时,它给出了“here”。但
public void names(String[] names)
{
String msg=" - ";
System.out.println(msg);
}
这里当我从主叫它时给出 - 而不是“这里”BUt它是最终的静态。它为什么会改变,为什么没有编译错误?或者我误解了所有的java?
答案 0 :(得分:8)
您正在使用两个不同的变量,类变量是不可变的(最终)但本地变量不是,它们具有相同的名称但它们不相同。
如果你想验证这一点,请在主要方法中输入类似 MyClassName.msg =“ - ”的内容,你会看到编译器会抱怨。
答案 1 :(得分:4)
这称为阴影...传递给System.out.println
的字符串是您在名称方法中定义的字符串,因为它的范围比类级别更严格。
看看http://en.wikipedia.org/wiki/Variable_shadowing
答案 2 :(得分:2)
msg
是names
方法中的局部变量。它不会在类级别更改变量。
答案 3 :(得分:1)
它没有改变。
在此代码段中,您访问了本地变量。
public void names(String[] names)
{
String msg=" - ";
System.out.println(msg);
}
如果要访问静态字段:
System.out.println(ClassName.msg);
答案 4 :(得分:1)
您正在msg
方法中定义名为names()
的局部变量。它与static final
类方法不同。方法内的局部变量隐藏了类变量。
答案 5 :(得分:1)
它没有改变。您已将“{1}}成员隐藏”在本地变量后面。 static final
变量仍具有旧值 - 您可以使用static final
访问它,其中XXX.msg
是您班级的名称。
答案 6 :(得分:1)
String msg=" - ";
是存储在堆栈中的局部变量,而static final String msg="here";
是存储在permgen空间中的类级变量,直到java 6(存储在java7中的堆中)。简而言之,这里指的是两个不同的变量