版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23013309/article/details/80550357
//java 类在编译后会产生一个以.class结尾的字节码文件
//该文件内存储了Class对象的相关信息,Class对象表示的是类在运行时的类型信息
//Class与java.lang.reflect构成了java的反射技术
//当我们要使用类时,例如使用new 操作符实例化一个新对象,访问类的静态方法,
//jvm会先检查该类的有无加载,若有加载了就会直接进行相应的操作
//若检查到没有加载,jvm就会先去加载这个类的对应的字节码文件(这里会进行相应的检查)
//当加载成功后,就可以进行相应的操作了
public class ClassTest{
public static void main(String [] args) throws Exception{
System.out.println("before loading Circle.");
// 可以指定要加载的类
Class.forName("Circle"); // 这里需要捕获异常或者抛出异常到下一级
System.out.println("after loading Circle.");
System.out.println("before loading Rectangle.");
Rectangle re = new Rectangle();
System.out.println("after loading Rectangle.");
System.out.println("************************************");
System.out.println("before loading A1.");
System.out.println(A1.trueFinal);
System.out.println("before loading A2.");
System.out.println(A2.noFinal);
System.out.println("************************************");
//使用类字面常量来得到Class,利用反射来构建实例对象(调用的是默认构造函数)
// 调用类字面常量不会触发类的初始化
Class<?> c = A3.class;
System.out.println("before loading A3.");
A3 a3 = (A3)c.newInstance();
System.out.println("************************************");
//根据运行结果:在继承关系里,在类的初始化时总是先初始化父类,在初始化子类
//实例化时也是如此
System.out.println("before loading D1.");
D1 d1 = new D1();
}
}
class Circle {
static {
//类在加载初始时,会执行这段static代码块
System.out.println("loading Circle...");
}
}
class Rectangle {
static {
//类在加载初始时,会执行这段static代码块
System.out.println("loading Rectangle...");
}
}
class A1 {
// 编译期常量,不会触发类的初始化
public static final int trueFinal = 10;
static {
//类在加载初始时,会执行这段static代码块
System.out.println("loading A1...");
}
}
class A2 {
// 静态常量,触发类的初始化
public static int noFinal = 5;
static {
//类在加载初始时,会执行这段static代码块
System.out.println("loading A2...");
}
}
class A3 {
static {
//类在加载初始时,会执行这段static代码块
System.out.println("loading A3...");
}
}
class B1 {
static {
System.out.println("loading B1");
}
public B1(){
System.out.println("B1's instance");
}
}
class D1 extends B1{
static {
System.out.println("loading D1");
}
public D1(){
System.out.println("D1's instance");
}
}