何时选择变量来声明为最终静态

时间:2012-11-27 06:36:55

标签: java android static final

我也使用了final和static变量。我发现这些变量是,

最终变量

  • 最终变量只能通过初始值设定项或赋值语句初始化一次。

  • 与常量的值不同,最终变量的值在编译时不一定是已知的。

我应该将哪些变量声明为最终 -

我经常使用那些值普遍且永远不会改变的变量,例如PI的值。

public static final double PI = 3.141592653589793;

静态变量

  • 这些变量属于类而不属于对象(实例)。

  • 静态变量仅在执行开始时初始化一次。

  • 所有类实例共享的单个副本

  • 静态变量可以直接通过类名访问,不需要任何对象。

我应该将哪些变量声明为最终 -

大多数情况下,我使用那些我想初始化的变量,并在enitre类中使用它们。

何时使用最终静态变量

现在,我在我的一个数据库项目中遇到了一个术语final static。我发现一些数据库对象甚至数据库版本都被声明为statci final。

 static final String DATA_BASE = "BackUpDatabase.db";
    static final int DATA_BASE_VERSION = 1;

现在,我的问题是我们应该将变量声明为finalstaticfinal static,因为使用其中任何一个都可以解决问题,然后将两者结合使用。

7 个答案:

答案 0 :(得分:5)

声明为static final的变量(反之亦然)被理解为有意义的常量,并以全部大写的形式命名为带空格的下划线。

常见常量的示例是Integer.MAX_VALUEMath.PI

答案 1 :(得分:5)

static -  Only use when a variable which is used globally 
final -  Only use when you need to declare a value as constant 

static final - Only use when a value is globally used and it is a constant.

: - Here global means across all the instances of a java class

答案 2 :(得分:3)

java中的

- static表示Class的成员。它由该类的所有实例共享。

java中的

- final关键字表示常量,但根据其应用的含义有不同的解释。

- 当我们在字段上使用static final时,请将其视为全局变量。

- PI是Math Class的静态变量,使用类名称直接访问,Math.PI

- 使用大写字母中的所有字母来定义静态最终变量。

最终解释:

final variable :无法更改其值

final method :无法覆盖

final class :无法扩展

final Parameter :无法更改从调用者的参数

收到的值

final Object Reference Variable :它不能引用任何其他对象,而不是它当前引用的对象

答案 3 :(得分:3)

最终仅表示初始化后的值无法更改; 静态表示该属性属于Class和NOT对象。

所以当你说最终静态;这意味着只有一个变量副本,无法更改。

答案 4 :(得分:2)

仅将变量声明为静态可导致其值的一个或多个实例更改其值。

将它们声明为静态final将帮助您创建一个CONSTANT,因为@Vulcan告诉。只存在一个可以在任何地方访问的副本。

答案 5 :(得分:1)

静态变量

  • 您可以通过调用静态方法来更改静态变量值 出现在同一个班级。
  • 从此创建的所有对象的静态变量值都相同 上课。如果我们改变了值,那么该类的所有对象都将得到 新价值,旧价值将会丢失。
  • 可以多次更改值。

最终变量

此变量值可以通过两种方式初始化:

  1. 在声明变量时。
  2. 在创建该类的对象时,类构造函数将具有JOHN
  3. 初始化后,无法通过任何方法(静态或非静态)更改。

答案 6 :(得分:1)

静态方法或类是隐式最终的。 因为对于所有对象只存在此方法的一个副本,这意味着子类无权修改副本。 假设您在父级中有一个方法,并且您不希望子类更改此方法。只需将父方法声明为final。干得好。

class Parent {

    final void myMethod() {
        //No one can change this method from subclassess 
        //compiler works efficiently because it knows that this method will not change
    }
}

class Child extends Parent{
   //from this class I can use myMethod but I cannot override.
}