2013-07-18 71 views
2

我写了我的代码,但现在我试图改变,看看发生了什么。最终静态可以更改吗?

在对象类字段,

static final String msg="here"; 

而且在同一个对象,在methot

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

在这里它提供了 “这里” 当我从主调用。但是

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

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

+2

“names”方法中的局部变量隐藏了静态变量。 – assylias

+3

哦,好的,谢谢大家。我无法通过阅读来学习。 – CursedChico

回答

8

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

如果你想验证这一点,把你的主要方法,如MyClassName.msg =“ - ”,你会看到编译器会抱怨。

+2

不可变!=最终。他们是两个不同的概念。事实上,String类是一个不可变的类。请在这里阅读进一步的解释http://stackoverflow.com/a/8798424/2542027 – Multithreader

2

msgnames方法中的局部变量。它不会在课堂上改变变量。

1

它没有改变。

在这段代码中,您访问本地变量。

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

,如果你要访问的静态字段:

System.out.println(ClassName.msg); 
1

你定义一个名为msgnames()方法中的局部变量。它与static final类方法不一样。方法内的局部变量隐藏类变量。

1

它没有改变。您已将您的static final成员“隐藏”在局部变量后面。 static final变量仍具有旧值 - 您可以使用XXX.msg访问它,其中XXX是您的班级的名称。

4

这就是所谓的阴影...传递给System.out.println的字符串是您在名称方法中定义的字符串,因为它在类级别上具有更严格的范围。 检查了这一点http://en.wikipedia.org/wiki/Variable_shadowing

+0

+1教育链接:) –

+0

我不同意术语阴影,因为你仍然可以访问这两个变量 –

1

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