【问题标题】:Java basics: a static function without a name, or return typeJava 基础:没有名称或返回类型的静态函数
【发布时间】:2011-08-03 20:37:06
【问题描述】:
public class Main {
    public static final Logger LOGGER = Logger.getLogger(Main.class.getName());

    static {
        try {
             LOGGER.addHandler(new FileHandler("errors.log",true));
        }
        catch(IOException ex) {
             LOGGER.log(Level.WARNING,ex.toString(),ex);
        }
    }
...

我想知道这个无名的静态函数是关于什么的。

我从未在 java 中看到过这样的东西(我目前正在学习)。

它有什么用?

一般什么时候使用?

什么时候在程序中执行?

【问题讨论】:

  • 谢谢大家,不需要这么多答案 :)

标签: java function static static-initializer


【解决方案1】:

这称为静态块,在初始化期间只会执行一次。另外,如果有多个静态初始化块,运行时保证它们会按照它们在源代码中出现的顺序被调用。

这是一个很好的解释,带有一些示例代码。 https://www.geeksforgeeks.org/g-fact-79/

【讨论】:

  • 那个链接失效了=(
  • @gismo 刚刚添加了一个新链接
【解决方案2】:

加载类时执行一次。在这种特定情况下,它会为应用程序设置一个记录器。

【讨论】:

    【解决方案3】:

    您只能使用带有静态块的静态成员变量。并通知即使你多次调用 constructorstatic block 也只会在 JVM 上运行一次。

    为什么我们需要静态块?因为我们无法在构造函数中初始化我们的 static final 成员变量,所以没有任何意义。

    因此,您可以使用构造函数初始化静态变量,因为它们是按实例创建的。你应该在一个静态块中初始化你的静态最终变量。非最终静态成员变量的初始化可以写在静态块中,也可以不写,这是一个选择。您可能希望在创建时在每个实例上初始化相同的值,然后在构造函数中分配静态变量以重置静态变量。如果只想设置一次静态变量,那么即使它不是final成员变量,也必须在静态块内部编写init语句。

    这是一个简单的演示;

    A - 带有静态初始化块的示例模型类

    public class SampleModel {
    
        private int index;                          // Will be init within the constructor
        private static final int MAX_VALUE;         // Will be init within static block
        private static String messageOfTheDay;      // Will be init within static block
    
        // Argument Constructor
        public SampleModel(int index) { 
            this.index = index;
            System.out.println("Constructor called");
        }
    
        // static block, will be run only once!
        static {
            System.out.println("WARNING: Static Block called !");
    
            MAX_VALUE = 69;
            messageOfTheDay = "I'm here";
        }
    
        public String getMessageOfTheDay() {
            return messageOfTheDay;
        }
    
        public int getMaxValue() {
            return MAX_VALUE;
        }
    
        public int getIndex() {
            return index;
        }
    
    }
    

    B - 演示代码

    public class StaticBlockDemo {
    
        public static void main(String[] args) {
            SampleModel obj1 = new SampleModel(1);
            SampleModel obj2 = new SampleModel(2);
            SampleModel obj3 = new SampleModel(3);
    
            System.out.println();
            System.out.println( "obj1 : index    : " + obj1.getIndex() );
            System.out.println( "obj1 : Max Value: " + obj1.getMaxValue() );
            System.out.println( "obj1 : Max MOTD : " + obj1.getMessageOfTheDay() + "\n");
    
            System.out.println( "obj2 : index    : " + obj2.getIndex() );
            System.out.println( "obj2 : Max Value: " + obj2.getMaxValue() );
            System.out.println( "obj2 : Max MOTD : " + obj2.getMessageOfTheDay() + "\n");
    
            System.out.println( "obj3 : index    : " + obj3.getIndex() );
            System.out.println( "obj3 : Max Value: " + obj3.getMaxValue() );
            System.out.println( "obj3 : Max MOTD : " + obj3.getMessageOfTheDay() + "\n");
    
        }
    
    }
    

    C - 输出

    WARNING: Static Block called !
    Constructor called
    Constructor called
    Constructor called
    
    obj1 : index    : 1
    obj1 : Max Value: 69
    obj1 : Max MOTD : I'm here
    
    obj2 : index    : 2
    obj2 : Max Value: 69
    obj2 : Max MOTD : I'm here
    
    obj3 : index    : 3
    obj3 : Max Value: 69
    obj3 : Max MOTD : I'm here
    

    通知在输出中,constructor 被调用了 3 次,而 static block 只被调用了一次。

    【讨论】:

      【解决方案4】:

      这是一个Static Initialization Block,在加载类时运行一次。可用于初始化静态成员变量。

      【讨论】:

        【解决方案5】:

        这是一个static initializer,将在类初始化期间执行。如您所见,它允许您在该阶段运行复杂的逻辑,包括异常处理。

        【讨论】:

          【解决方案6】:

          它是一个初始化块,在类加载时调用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-24
            • 2013-07-10
            • 2012-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多