2011-06-27 46 views
1

变量声明为static以获取其值的最新单一副本;这意味着价值将在某个地方发生变化。但为什么要声明同一个变量为final,这将不允许变量在其他位置(常量值)被更改?为什么变量应声明为静态和最终

+7

我认为你有“静”混淆“挥发”。 –

+3

(为什么人们喜欢这样的问题?) –

+0

@Stephen C:如果至少有3人(包括你)不同意upvotes:为什么没有人倒退它? –

回答

-1

最终停止继承了它

+2

恩,这是一个字段... –

+1

最后的'fields'可以被子类访问。公众的访问任何地方。 –

+0

@Peter:最终与可达性正交。 –

1

当地variables是在堆栈上,并没有任何的静态类。

您可以有一个静态的field这可能是也可能不是最终的。如果它不会改变的话,你会让这个区域成为最后的决定。

8

static这样就可以在不创建类实例的情况下访问该变量或方法,并且每个实例只有一个变量而不是一个变量。

A final class不能扩展。一个final变量不能改变它的值,它表现为一个常量。并且方法不能被覆盖。

2

声明为静态的变量表示其值由该类的所有实例共享。将变量声明为final会使性能稍微好一些,并使代码更易读。

+2

我宁愿将它看作“与类型相关而不是类型的任何实例” - “由所有实例共享”表示必须有*至少一个*实例,但情况并非如此。 –

1

static final在Java中用于表示常量。静态用于表示类变量,因此不需要为该类实例化对象以访问该变量。

最终方法不能被覆盖,最终变量只能被初始化一次。

如果您只使用static关键字,则该值不会是一个常量,因为它可以再次初始化。

1

static字段可以修改(例如public static字段可以被任何类别修改)。初始化后无法修改static final字段。

1

静态与获取最新和单一副本无关,除非这里的“单一副本”意味着一个类的所有实例都具有相同的值(但是,我认为您可能会将其与volatile混淆)。静态意味着类变量。当你希望它是一个常量时,你可以做到最终结果(这实际上是Java常量声明的方式:static final)。

+0

'静态'确实是关于“单一副本”,如果你有两个赋值给某个字段'o1.x = 0; o2.x = 1;'那么除非该字段是静态的,否则当读取'o1.x'时后面的赋值可能不可见。 (不要说这个问题是有道理的,只是说他不确定他确实将它与易失性混合在一起。) – aioobe

+0

感谢您指出这一点,我将对其进行编辑以使其清晰。 –

1

可能会提供类似于constants的东西。

-1

您创建了static final变量以使其值无需实例化对象即可访问。 例如: -

public class MyClass 
{ 
    public static final String endpoint= "http://localhost:8080/myClass": 
    /* ...*/ 
} 

然后你就可以访问使用该行的数据:

MyClass.endpoint 
+0

错误,这就是你使用'static'的原因。 'final'既不在这里,也不在那里 – Nick

+0

'final'是为constness。没有最后的任何人都可以改变价值。 – LoSciamano

+0

这种说法是正确的。然而,你的回答是误导性的,因为它意味着'static final'和变量可以在没有实例化对象的情况下被访问的事实之间的联系。 'final'关键字不影响是否可以在不实例化对象的情况下访问变量,例如,你可以拥有一个非静态的'final'变量,如果没有这个类的存在就不能访问它。 – Nick

1

像你提到的自己,这样做是为了创建常量。您创建一个字段来保存具有特定含义的值。这样你就不必在任何地方声明该值,而是可以引用静态。

3

一个变量被定义为final的那一刻,它可能不应该被称为“可变的”,因为它不再是“变化” :)

static变量不依赖于的任何特定实例阶级 - 它只与阶级本身相关联,而且仅从范围的角度来看。

所以,你是 - 一个staticfinal变量实际上是一个值不绑定到任何特定类的实例,并不会改变。它是一个常量值,可以从Java代码中的任何地方引用。

在某些时候,当您决定更改此常量的值时,只需进行一次更改即可将此更改正确传播到所有其他使用此常量的类。

0

变量应该只有当他们在课堂上的more than one方法或如果程序调用类的方法之间应该save their valuesrequireduse声明为fields

例如user.lastName lastName的应该是字段,因为它是needed期间object lifecycle

static只有当他们需要 not使用在类的一种以上的方法或

变量应声明如果程序应该not在调用类的方法之间保存它们的值。

例如Math.max(num1,num2)not intristed在NUM1和NUM2 after compleating此操作

相关问题