Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 决赛是静态的还是静态的重要吗?_Java_Optimization_Constants_Final - Fatal编程技术网

Java 决赛是静态的还是静态的重要吗?

Java 决赛是静态的还是静态的重要吗?,java,optimization,constants,final,Java,Optimization,Constants,Final,将类常量声明为静态与否有关系吗 public class MyClass { private final static int statConst = 1; private final int nonStatConst = 2; } statConst和nonStatConst永远不会更改,因为它们是最终的,所以即使是nonStatConst在每个实例中都是相同的。我是否使它们成为静态的有关系吗 (我意识到只有private final int otherConst;)是的,这

将类常量声明为静态与否有关系吗

public class MyClass {
    private final static int statConst = 1;
    private final int nonStatConst = 2;
}
statConst
nonStatConst
永远不会更改,因为它们是最终的,所以即使是
nonStatConst
在每个实例中都是相同的。我是否使它们成为静态的有关系吗

(我意识到只有
private final int otherConst;
)是的,这很重要

nonStatConst
属于特定的
实例

statConst
跨所有实例共享

静态上下文
在访问时也很重要


进入
final
如果您这样声明,则必须在构造函数完成之前初始化您在类中声明的字段。

如果它是静态的,您将只创建一个与类关联的常量,如果它对于每个对象都是非静态的,则将新创建该常量。如果它是非静态的,则在不为类创建对象的情况下无法访问它

唯一不同的方法是,如果要从静态上下文引用成员;换句话说,您没有要处理的类的特定实例。在这种情况下,您需要变量是静态的。

不同的是,在每个实例中,空间将分别分配给
非statconst
。对于静态<代码> STATCONST< <代码>空间将只分配一次。

有两件事要考虑。

  • 如果不将变量设为静态,则创建的MyClass的每个实例都将为每个变量分配新的内存空间(nonStatConst)。相反,不管我们有多少MyClass实例,statConst只分配一次内存空间

  • 如果nonStatConst不是静态的,则必须实例化MyClass才能访问它


  • 是的,这很重要,特别是如果你有一个
    静态
    方法,它只能调用
    静态常量
    主要的区别是静态最终原语和字符串在字节码中内联(硬编码)。对,我在想原语类型。我知道
    静态
    的意思。但是在
    final
    的情况下,我不明白这会有什么不同。优化编译不能在不影响任何行为的情况下将所有
    private final int
    更改为
    private final static int
    ?没有回答这个问题。是的,也用
    final
    重新表述,请看一看。@Andreas:我很确定,编译器不会这样做。1.这不是一个与实际程序相关的优化,因为每个程序员自己都可以轻松地完成。2.我相信编译器不允许做这样的优化。啊,我不知道。那么,使用非静态final有什么好处呢?通常在您要在构造函数中设置值的情况下,您会使用非静态final。在初始化器中将其设置为常量会使其变得毫无意义。此外,调用ClassName.constant比查找或创建实例要容易得多。