Java中的最终变量是否需要使用“static”关键字?

问题描述

我对 Java 中的 finalstatic 关键字感到困惑,我需要澄清以下问题:

1.对于变量,有没有必要用static?例如:

public final int ERROR_CODE = 200;

我认为没有必要使用 static 如下所示。我错了吗?

public static final int ERROR_CODE = 200;

2. 据我所知,静态对于方法、类来说是有意义的,可以在不创建实例的情况下使用它们。 但是,同样在这个静态方法中使用 static 变量对于同时改变它们的值也很有意义:

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances


3. 我可以更改 final 和 static 关键字的顺序,例如

public static final int ERROR_CODE = 200; 

public final static int ERROR_CODE = 200; 

解决方法

staticfinal 是不同的概念。 static 成员属于类而不是实例,而您不能重新分配 final 变量。

MyClass.myVariable = 5; //这个变化体现在两个实例中

➡️ 如果 myVariable 被声明为 final,这是不可能的。

我可以更改 final 和 static 关键字的顺序,例如

public static final int ERROR_CODE = 200;或

public final static int ERROR_CODE = 200;

➡️ 是的。没什么区别。

,

也许你的类还没有达到这个程度,但类是一个对象,由类加载器管理。类加载器加载类并确保只有一个类对象。类对象是静态变量和方法所在的地方。

对于#1,静态意味着有一个属于该类的变量。没有 static 的声明意味着它是一个实例变量,并且您为该类创建的每个实例都有自己的变量。对于常量,将变量设为 static final,这样就只有一个。

Final 表示值不变。如果变量是原始变量,则不能重新分配该值。如果变量是引用类型,则您无法更改变量指向的内容。如果指向的对象本身是可变的,final 不会改变它。

对于2,静态变量属于类,你的静态方法之一可以改变变量中的内容,其他方法可以看到变化。全局可变状态令人困惑,而且您也将面向对象的良好实践抛在脑后,进入了一个肮脏的黑客领域,因此在使用此功能时要非常谨慎。

#3:来吧,你可以在大约 10 秒内亲自尝试一下。无论哪种方式都有效。 google style guide 建议“静态最终”。

,

1:static 不是需要,只要常量只能从实例内部访问(或使用实例)。但是要在没有实例的情况下访问它,它必须是 static。更重要的是,恕我直言,它应该是一个类变量,因为拥有一个常量(独立于实例)的实例变量是没有意义的 - 另见下一点。

2:你描述的是功能 - 有点相关,数据设计,数据模型,static 表示与实例成员相反的类成员(字段,方法) - OO的重要部分设计

3:顺序并不重要……但是,Java Language Specification 建议

方法修饰符: (之一) Annotation 公共保护私有 抽象静态最终同步原生strictfp
...
如果两个或多个(不同的)方法修饰符出现在一个方法声明中,虽然不是必需的,但通常它们的出现顺序与上面 MethodModifier 产生式中所示的顺序一致。

,

#1 用文字初始化非静态最终变量:

class MyClass {
   public final int ERROR_CODE = 200;
}

一种不好的做法,因为:

  1. 该类的每个实例都将具有该变量的相同值的副本,因为它旨在用作全局常量,这会浪费内存。
  2. 静态访问常量是不可能的,所以 MyClass.ERROR_CODE 不会编译,如果你只需要这个值,你总是需要一个实例,例如new MyClass().ERROR_CODE

#2 静态变量

静态变量在几种情况下很有用,例如单例模式或与类相关的缓存,或者只是当您想在同一类的所有实例之间共享一些公共数据时

#3 是