2016-08-04 32 views
-4

我检讨一类,我注意到有一个最终双变量称为Kilograms_Per,但在声明之前静态,有什么用的静态自变量是最终?这是段:“静态”对“最终”变量有什么用处?

public static final double KILOGRAMS_PER_POUND = 0.45359237; 
+0

最终关键字指示不能更改的变量的常量值,而 一个变量被声明为关键字“static”,它被称为“类变量”。所有实例共享相同的变量副本。一个类变量可以直接用类访问,而不需要创建一个实例。 – Vickyexpert

+0

static和final是两个完全不同的关键字 - public static将在类级别声明这个变量(不是实例),并允许你从另一个class as MyClass.KILOGRAMS_PER_POUND' –

+0

check http://stackoverflow.com/questions/15655012/how-final-keyword-works – Junaid

回答

5

static意味着该变量与类关联,而不是该类的一个实例。

final表示变量在初始化后无法重新分配。如果您试图再次更改KILOGRAMS_PER_POUND,则会出现编译器错误。

staticfinal彼此正交。假设你有这个类:

public class Foo { 
    public static final double KILOGRAMS_PER_POUND = 0.45359237; 
} 

变量KILOGRAMS_PER_POUND可以是:

  1. static只,这意味着该变量与对象相关联,因此它是作为Foo.KILOGRAMS_PER_POUND从另一个类引用。因为它不是final,变量也可以重新分配,例如, Foo.KILOGRAMS_PER_POUND = 3.14

  2. final只。因为它不是static,变量必须由类的一个实例引用,例如, Foo foo = new Foo(); System.out.println(foo.KILOGRAMS_PER_POUND);因为变量是final,所以不能重新分配。

  3. static and final。因为它是静态的,所以它被引用为另一个类的Foo.KILOGRAMS_PER_POUND。因为它是最终的,所以不能重新分配。

0

final关键字声明的东西是一个常量,不会改变。转换,数学常数等都被认为是常数。看看下面的例子:

public final double PI = 3.1415926; //Not as precise as many languages 

我们定义了一个常量,PI,永远不会改变,第一次分配后不能更改。

静态的东西是特定于类的东西,而不是实例。我们通常这样创建新的对象:

Test t = new Test(); //If we had a Test class 

然后通过点符号访问实例变量和方法,而是用静态变量和方法,可以使用类名,然后将字段或方法。这意味着它不是特定于类(或对象)的任何实例,而是针对类。看看下面的例子,考虑我们有一个数学类:

public static final double PI = 3.1415926; 

public static toRadians(double degs) { 
    return degs * PI/180; 
} 

这里,这是不方便的,不切实际的,和荒谬创建一个新的对象,只为了呼唤toRadians,所以这实际上是静态的。现在,我们可以通过这个访问:

Math.toRadians(39.29); 
System.out.println(Math.PI); 

的方法之外的任何变量必须声明为static在静态环境中使用。这适用于main方法,并且main方法内引用或执行的方法之外的任何变量或方法必须是静态的,因为main是静态的。这里有一个例子:

public static void main(String[] args) { 
    testMethod(); 
} 

private static testMethod() { //Must be static because it is called in a static method 
    System.out.println("Hello"); 
} 

结论,那就是声明为static和最终的东西是恒定的,在静态环境中使用或在静态上下文中引用 东西。数学常数(如Pi和e)通常以这种方式定义,因为它们是通过类而不是实例引用的,并且是不变的常量