final int和final static int之间的区别

时间:2012-11-20 02:09:25

标签: java

  

可能重复:
  java: is using a final static int = 1 better than just a normal 1?

嗯,我想知道之间有什么区别: final int a = 10; 和 final static int a = 10; 当它们是类的成员变量时,它们都保持相同的值,并且在执行期间不能随时更改。 除了静态变量是由所有对象共享还是在非静态变量的情况下创建副本之外还有其他区别吗?

5 个答案:

答案 0 :(得分:10)

如果在声明变量时初始化变量,则没有实际的区别。

如果变量在构造函数中初始化,则会产生很大的不同。

请参阅以下示例:

/** 
 *  If you do this, it will make almost no 
 *  difference whether someInt is static or 
 *  not.
 *
 *  This is because the value of someInt is
 *  set immediately (not in a constructor).
 */

class Foo {
    private final int someInt = 4;
}


/**
 *  If you initialize someInt in a constructor,
 *  it makes a big difference.  
 *
 *  Every instance of Foo can now have its own 
 *  value for someInt. This value can only be
 *  set from a constructor.  This would not be 
 *  possible if someInt is static.
 */

class Foo {
    private final int someInt;

    public Foo() {
        someInt = 0;
    }

    public Foo(int n) {
        someInt = n;
    }

}

答案 1 :(得分:2)

静态变量可通过其类定义之外的点分隔符访问。 所以,如果你有一个名为myClass的类,并且在其中你有静态int x = 5; 然后你可以用myClass.x引用它;

final关键字表示在定义x后不允许更改x的值。如果您尝试这样做,编译器将停止并显示错误。

答案 2 :(得分:0)

作为static变量,您不需要该类的实例来访问该值。唯一的另一个区别是static字段未序列化(如果类是可序列化的)。它也可能在编译代码中对它的所有引用都被优化掉了。

答案 3 :(得分:0)

如果您仅使用int,则不会显示差异。但是,作为它的不同之处的一个例子:

class PrintsSomething {
   PrintsSomething(String msg) {
       System.out.println(msg);
   }
}

class Foo {
    public static final PrintsSomething myStaticObject = new PrintsSomething("this is static");
    public final PrintsSomething myLocalObject = new PrintsSomething("this is not");
}

当我们运行时:

new Foo();
new Foo();

...输出是这样的:

this is static
this is not
this is not

答案 4 :(得分:0)

我想指出,静态修饰符只能用于显式需求,而最终只用于常量。