3

我写了我的代码,但现在我正试图改变以查看发生了什么。

在对象类字段中,

static final String msg="here";

在同一个对象中,在一个方法中

public void givemessage(int no)
{
    System.out.println("look.");       
    System.out.println(msg);
}

当我从 main 调用时,这里它给出“这里”。但

public void names(String[] names)
{
    String msg=" - ";
    System.out.println(msg);
}

在这里,当我从 main 调用时,它给出了-,而不是“这里”,但它是最终的静态。为什么它改变了,为什么没有编译错误?或者我误解了所有的java?

4

7 回答 7

8

您正在使用两个不同的变量,类变量是不可变的(最终的)但本地变量不是,它们具有相同的名称但它们不相同。

如果您想验证这一点,请在您的 main 方法中输入类似MyClassName.msg="-"的内容,您会看到编译器会抱怨。

于 2013-07-18T10:12:56.577 回答
4

This is called shadowing... the String which is passed to System.out.println is the one you defined within your names method as it has a tighter scope as the one on class level. Check this out http://en.wikipedia.org/wiki/Variable_shadowing

于 2013-07-18T10:15:53.947 回答
2

msgnames方法中的局部变量。它不会更改类级别的变量。

于 2013-07-18T10:13:07.023 回答
1

It did not change. You've "hidden" your static final member behind the local variable. The static final variable still has the old value - you can access it using XXX.msg, where XXX is the name of your class.

于 2013-07-18T10:15:13.220 回答
1

它没有改变。

在此代码段中,您访问的是局部变量。

public void names(String[] names)
{
    String msg=" - ";
    System.out.println(msg);
}

如果要访问静态字段:

System.out.println(ClassName.msg);
于 2013-07-18T10:14:22.127 回答
1

msg您正在定义一个在方法内部命名的局部变量names()。它与static final类方法不同。方法内部的局部变量隐藏了类变量。

于 2013-07-18T10:14:24.110 回答
1

String msg=" - ";是存储在堆栈中的局部变量,而static final String msg="here";在 java 6 之前是存储在 permgen 空间中的类级别变量(存储在 java7 中的堆中)。简而言之,您在这里指的是两个不同的变量

于 2013-07-18T10:27:02.067 回答