类初始化场景 JDK1.7
来源:互联网 发布:如何查看数据库主键 编辑:程序博客网 时间:2024/06/16 00:40
package com.jvm;
/**
*
* 类初始化场景
*
* 虚拟机中严格规定了有且只有5种情况必须对类进行初始化。
*
* <pre>
* 1.执行new、getstatic、putstatic和invokestatic指令;
* 2. 使用reflect对类进行反射调用;
* 3.初始化一个类的时候,父类还没有初始化,会事先初始化父类;
* 4.启动虚拟机时,需要初始化包含main方法的类;
* 5. 在JDK1.7中,如果java.lang.invoke.MethodHandler实例最后的解析结果REF_getStatic、REF_putStatic
* 、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化;
* </pre>
*
* @author hao
* @since 7.0
*/
public class _initTest {
@SuppressWarnings("unused")
public static void main(String[] args) {
System.out.println("main init !");
System.out.println();
// -1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
System.out.println("// -1. ----------//");
System.out.println(Child.a);
System.out.println();
// -2. 定义对象数组,不会触发该类的初始化。
System.out.println("// -2. ----------//");
Array[] arrays = new Array[10];
System.out.println();
// -3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。
System.out.println("// -3. ----------//");
System.out.println(Const.a);
System.out.println();
// -4. 通过类名获取Class对象,不会触发类的初始化。
System.out.println("// -4. ----------//");
Class<?> c_Cat_Tom = Cat_Tom.class;
System.out.println();
// -5.
// 通过Class.forName加载指定类时,如果指定参数initialize为false时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。
System.out.println("// -5. ----------//");
try {
Class<?> clazz = Class.forName("com.jvm.Cat_H", false, Cat_H.class.getClassLoader());
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println();
// -6. 通过ClassLoader默认的loadClass方法,也不会触发初始化动作
System.out.println("// -6. ----------//");
try {
new ClassLoader() {
}.loadClass("com.jvm.Cat_T");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
}
}
// -1. ------------------------------------------------------------------//
class Parent {
public static int a = 100;
static {
System.out.println("Parent init !");
}
}
class Child extends Parent {
static {
System.out.println("Child init !");
}
}
// -2. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Array {
private String name;
private int age;
static {
System.out.println("Array init !");
}
}
// -3. ------------------------------------------------------------------//
class Const {
public static final int a = 100;
static {
System.out.println("Const init !");
}
}
// -4. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_Tom {
private String name;
private int age;
static {
System.out.println("Cat_Tom is load !");
}
}
@SuppressWarnings("all")
class Cat_Jack {
private String name;
private int age;
static {
System.out.println("Cat_Jack is load !");
}
}
// -5. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_H {
private String name;
private int age;
static {
System.out.println("Cat_H is load !");
}
}
// -6. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_T {
private String name;
private int age;
static {
System.out.println("Cat_T is load !");
}
/**
*
* 类初始化场景
*
* 虚拟机中严格规定了有且只有5种情况必须对类进行初始化。
*
* <pre>
* 1.执行new、getstatic、putstatic和invokestatic指令;
* 2. 使用reflect对类进行反射调用;
* 3.初始化一个类的时候,父类还没有初始化,会事先初始化父类;
* 4.启动虚拟机时,需要初始化包含main方法的类;
* 5. 在JDK1.7中,如果java.lang.invoke.MethodHandler实例最后的解析结果REF_getStatic、REF_putStatic
* 、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化;
* </pre>
*
* @author hao
* @since 7.0
*/
public class _initTest {
@SuppressWarnings("unused")
public static void main(String[] args) {
System.out.println("main init !");
System.out.println();
// -1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
System.out.println("// -1. ----------//");
System.out.println(Child.a);
System.out.println();
// -2. 定义对象数组,不会触发该类的初始化。
System.out.println("// -2. ----------//");
Array[] arrays = new Array[10];
System.out.println();
// -3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。
System.out.println("// -3. ----------//");
System.out.println(Const.a);
System.out.println();
// -4. 通过类名获取Class对象,不会触发类的初始化。
System.out.println("// -4. ----------//");
Class<?> c_Cat_Tom = Cat_Tom.class;
System.out.println();
// -5.
// 通过Class.forName加载指定类时,如果指定参数initialize为false时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。
System.out.println("// -5. ----------//");
try {
Class<?> clazz = Class.forName("com.jvm.Cat_H", false, Cat_H.class.getClassLoader());
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println();
// -6. 通过ClassLoader默认的loadClass方法,也不会触发初始化动作
System.out.println("// -6. ----------//");
try {
new ClassLoader() {
}.loadClass("com.jvm.Cat_T");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
}
}
// -1. ------------------------------------------------------------------//
class Parent {
public static int a = 100;
static {
System.out.println("Parent init !");
}
}
class Child extends Parent {
static {
System.out.println("Child init !");
}
}
// -2. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Array {
private String name;
private int age;
static {
System.out.println("Array init !");
}
}
// -3. ------------------------------------------------------------------//
class Const {
public static final int a = 100;
static {
System.out.println("Const init !");
}
}
// -4. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_Tom {
private String name;
private int age;
static {
System.out.println("Cat_Tom is load !");
}
}
@SuppressWarnings("all")
class Cat_Jack {
private String name;
private int age;
static {
System.out.println("Cat_Jack is load !");
}
}
// -5. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_H {
private String name;
private int age;
static {
System.out.println("Cat_H is load !");
}
}
// -6. ------------------------------------------------------------------//
@SuppressWarnings("all")
class Cat_T {
private String name;
private int age;
static {
System.out.println("Cat_T is load !");
}
}
0 0
- 类初始化场景 JDK1.7
- JDK1.8优化场景收集
- Java中List实现类的性能分析和应用场景(基于JDK1.8)
- JDK1.1 JDK1.2 JDK1.3 JDK1.4 JDK1.5 JDK1.6 JDK1.7
- Java集合类框架学习 2 —— ArrayList(JDK1.8/JDK1.7/JDK1.6)
- Java集合类框架学习 3 —— LinkedList(JDK1.8/JDK1.7/JDK1.6)
- jdk1.4 jdk1.5 jdk1.6 jdk1.7
- jdk1.4 jdk1.5 jdk1.6 jdk1.7
- jdk1.5 jdk1.6 jdk1.7 jdk1.8 特性
- jdk1.5 jdk1.6 jdk1.7 jdk1.8 特性
- jdk1.5 jdk1.6 jdk1.7 jdk1.8 特性
- jdk1.5 jdk1.6 jdk1.7 jdk1.8 特性
- jdk1.6 & jdk1.7共存
- Oracle442个应用场景----------初始化参数文件
- JDK1.7新特性--自动关闭类
- JDK1.7源码笔记之Arrays类
- JDK1.7源码笔记之String类
- JDK1.7源码笔记之ArrayList类
- 我对MVVM的理解
- hdu5877 Weak Pair 【树状数组+dfs】
- 服务器session持久化 SESSION.ser文件
- db2事务日志满,或者日志磁盘空间已满解决办法
- LeetCode: Kth Largest Element in an Array
- 类初始化场景 JDK1.7
- hihoCoder#1082 : 然而沼跃鱼早就看穿了一切(做题总结)
- 使用 XStream 把 Java 对象序列化为 XML
- Windows和Kali:重装Windows的MBR恢复问题
- 15级南阳理工软件学院卓越班笔试面试总结
- HDU1869-六度分离
- 使用RecyclerView加载网络图片时出现no adapter attached skipping layout
- Oracle ROWID理解
- JAVA基础6.57——final关键字