实例代码快
实例代码块的格式:
实例代码块的特点:
- 无static修饰。
- 会与类的对象一起加载,每次创建类的对象的时候,实例代码块都会被加载且自动触发执行一次。
- 实例代码块的代码在底层实际上是提取到每个类的构造器中去执行的!
实例代码块的作用:
实例代码块可以在创建对象之前进行实例资源的初始化操作,可以为成员常量赋值,可以抽取构造函数中的重复代码,提升代码复用性。
小结:
- 实例代码块无static修饰,属于对象,与对象一起加载执行。
- 实例代码块的代码在底层实际上是提取到每个构造器中去执行的!
- 实例代码块可以在创建对象之前进行实例资源的初始化操作。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class A{ { System.out.println("实例代码块1触发!"); } A(){ System.out.println("构造方法执行!"); } { System.out.println("实例代码块2触发!"); }
public static void main(String[] args) { A obj = new A(); } }
输出结果: 实例代码块1触发! 实例代码块2触发! 构造方法执行!
|
反编译结果
1 2 3 4 5 6 7 8 9 10 11
| class A { A() { System.out.println("实例代码块1触发!"); System.out.println("实例代码块2触发!"); System.out.println("构造方法执行!"); }
public static void main(String[] args) { new A(); } }
|
静态代码块
静态代码块的格式:
静态代码块特点:
- 必须有static修饰。
- 会与类一起优先加载,且自动触发执行一次。
静态代码块作用:
可以在执行类的方法等操作之前先在静态代码块中进行静态资源的初始化操作。
小结:
- 静态代码块有static修饰,与类一起加载,自动触发执行一次。
- 静态代码块的作用:可以用于在静态代码块中进行静态资源的初始化操作。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class A{ static{ System.out.println("静态代码块1触发!"); } A(){ System.out.println("构造方法执行!"); } static { System.out.println("静态代码块2触发!"); }
public static void main(String[] args) { A obj = new A(); A obj_ = new A(); } }
|
反编译结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class A { A() { System.out.println("构造方法执行!"); }
public static void main(String[] args) { new A(); new A(); }
static { System.out.println("静态代码块1触发!"); System.out.println("静态代码块2触发!"); } }
|
应用案例
Socket.java:
1 2 3 4 5 6 7 8 9 10 11 12
| private volatile InputStream in; private volatile OutputStream out;
static { try { MethodHandles.Lookup l = MethodHandles.lookup(); IN = l.findVarHandle(Socket.class, "in", InputStream.class); OUT = l.findVarHandle(Socket.class, "out", OutputStream.class); } catch (Exception e) { throw new InternalError(e); } }
|