【问题标题】:how to initialize static final variable from other class in java如何在java中从其他类初始化静态最终变量
【发布时间】:2020-05-03 16:25:09
【问题描述】:

我想在 Main 方法中初始化 Final.value。 是否可以在其他类中初始化静态最终常量 在它的减速等级中?

public class Main {

    public static void main(String[] args) {
        //I want to initialize Final.value in Main method.
    }

}

class Final {
    //here is the static final variable which can be assigned vai a static block
    //but how do I initialize it in the main method if I don't use the static block?
    static final int value;


}

【问题讨论】:

  • 这就是final 的目的。设置一次后就不能再设置了。
  • 不,你不能......
  • 你不需要初始化块,只需在行内进行static final int value = 421
  • @Michael 他想从一个不同的类中设置它。
  • 您可能可以使用复杂的反射来做到这一点,但值得吗? stackoverflow.com/a/3301720/12609572

标签: java class static constants final


【解决方案1】:

你不能。您的看法可能是 main 发生在其他一切之前,因此在那里初始化事物是安全的,但这是不正确的。

考虑下面的代码。

class Scratch
{
    static
    {
        System.out.println(Foo.i);    
    }

    public static void main(String[] args)
    {
        Foo.i = 100;
    }
}

class Foo
{
    static int i;
}

它不会打印 100。它会打印 0,因为在 main 之前还有其他事情发生。

将字段设为 final 并不会改变这一事实。


静态初始化有两种选择。在静态初始化程序块中,就像您展示的那样,或内联:

static final int value = 421

Java 阻止您做您想做的事是有充分理由的:因为它可能会导致错误。

【讨论】:

  • 但是有没有办法在除减速类之外的任何其他类中初始化它?
  • @SHOONYA 不可以。你可以从另一个类中修改字段值,但在这种情况下它不能是final,也不能被认为是一个常量。
  • 注意,你可以使用另一个类来初始化它(通过调用另一个类的方法,例如private static final int x = SomeClass.computeX();)。
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多