为了账号安全,请及时绑定邮箱和手机立即绑定

静态初始化代码块与非静态初始化代码块之间的区别是什么?

静态初始化代码块与非静态初始化代码块之间的区别是什么?

繁华开满天机 2019-06-12 21:15:07
静态初始化代码块与非静态初始化代码块之间的区别是什么?我的问题是关于静态关键字的一种特殊用法。可以使用static关键字用于覆盖不属于任何函数的类中的代码块。例如,以下代码编译:public class Test {     private static final int a;         static {         a = 5;         doSomething(a);     }     private static int doSomething(int x) {         return (x+5);     }}如果删除static关键字它会抱怨,因为变量a是final..但是,可以同时删除这两者。final和static关键词,并使其编译。在这两方面我都很困惑。我怎么会有一个不属于任何方法的代码部分?怎么可能调用它呢?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关这方面的文档?
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

带有静态修饰符的代码块表示班级,等级初始化程序;没有静态修饰符,代码块是实例初始化器。

类初始化器按照定义的顺序(自上而下,就像简单的变量初始化器一样)在类加载时执行(实际上,当类被解析时,但这是一个技术性问题)。

实例初始化器按照类实例化时定义的顺序执行,在紧接执行构造函数代码之前,在超级构造函数调用之后立即执行。

如果你把static从…int a,它将成为一个实例变量,您无法从静态初始化器块访问该变量。这将无法用错误编译“非静态变量a不能从静态上下文中引用”。

如果你也移除static从初始化程序块中,它随后成为实例初始化程序,因此int a在构造时初始化。


查看完整回答
反对 回复 2019-06-12
?
慕仙森

TA贡献1827条经验 获得超8个赞

UFF!什么是静态初始化器?

静态初始化程序是static {}Java类中的代码块,并且在调用构造函数或main方法之前只运行一次。

好的!告诉我更多.。

  • 是一个代码块

    static { ... }

    在任何java类中。并在调用类时由虚拟机执行。
  • return

    支持语句。
  • 不支持任何论点。
  • this

    super

    是支持的。

嗯,我在哪里可以用呢?

可以在任何你觉得还好的地方使用:)那么简单。但是我看到大多数情况下,它是在数据库连接、API init、日志记录等操作中使用的。

不要只是叫!例子在哪里?

package com.example.learnjava;import java.util.ArrayList;public class Fruit {

    static {
        System.out.println("Inside Static Initializer.");

        // fruits array
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Pear");

        // print fruits
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        System.out.println("End Static Initializer.\n");
    }

    public static void main(String[] args) {
        System.out.println("Inside Main Method.");
    }}

输出?

内部静态初始化器。

苹果

桔黄色的

结束静态初始化器。

内部主要方法。

希望这能帮上忙!


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 817 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信