最终的静态可以改变吗?

时间:2013-07-18 10:11:05

标签: java

我编写了我的代码,但现在我正在尝试更改以查看正在发生的事情。

在对象类字段中,

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?

7 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

这称为阴影...传递给System.out.println的字符串是您在名称方法中定义的字符串,因为它的范围比类级别更严格。 看看http://en.wikipedia.org/wiki/Variable_shadowing

答案 2 :(得分:2)

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

答案 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中的堆中)。简而言之,这里指的是两个不同的变量