类的引用的简单理解
类的主动引用,一定会引起类的初始化
当虚拟机启动,先初始化main方法所在的类
1.new一个类的对象
2.调用类的静态成员(除了final常量)和静态方法
3.使用java.lang.reflect包的方法对类进行反射调用
4.当初始化一个类的时候,如果其父类没有被初始化,则会先初始化它的父类
类的被动引用 不会发生类的初始化
1.访问一个静态域时,只有真正的声名这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类被初始化
2.通过数组引用定义类时,不会触发此类的初始化
3.引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
public class Demo3 {
static{
System.out.println("mian方法所在类被初始化");
}
public static void main(String[] args) throws ClassNotFoundException{
/*
类的主动引用,一定会引起类的初始化 当虚拟机启动,先初始化main方法所在的类
1.new一个类的对象
2.调用类的静态成员(除了final常量)和静态方法
3.使用java.lang.reflect包的方法对类进行反射调用
4.当初始化一个类的时候,如果其父类没有被初始化,则会先初始化它的父类
*/
//new一个类的对象
//Animal animal = new Animal();//mian方法所在类被初始化 父类被初始化
//调用类的静态成员(除了final常量)和静态方法
//System.out.println(Animal.num);//mian方法所在类被初始化 3
//System.out.println(Animal.name);//mian方法所在类被初始化 父类被初始化 狗
//Animal.print();//mian方法所在类被初始化 父类被初始化 动物在叫
//使用java.lang.reflect包的方法对类进行反射调用
//Class c1 = Class.forName("exam.reflect.Cat");// mian方法所在类被初始化 父类被初始化 子类被初始化
//当初始化一个类的时候,如果其父类没有被初始化,则会先初始化它的父类
//Cat cat = new Cat();// mian方法所在类被初始化 父类被初始化 子类被初始化
/*
类的被动引用 不会发生类的初始化
1.访问一个静态域时,只有真正的声名这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类被初始化
2.通过数组引用定义类时,不会触发此类的初始化
3.引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
*/
//子类引用父类的静态变量,不会子类被初始化
//System.out.println(Cat.name);mian方法所在类被初始化 父类被初始化 狗
//通过数组引用定义类时,不会触发此类的初始化
//Animal[] animals = new Animal[5];//mian方法所在类被初始化
//Cat[] cats = new Cat[6];//mian方法所在类被初始化
//引用常量不会触发此类的初始化
//System.out.println(Animal.NAME);//mian方法所在类被初始化 动物
}
}
class Animal{
static{
System.out.println("父类被初始化");
name = "猫";
}
static String name = "狗";
static int num = 3;
public static final String NAME = "动物";
public static void print(){
System.out.println("动物在叫");
}
} class Cat extends Animal{
static {
System.out.println("子类被初始化");
}
static String color = "黄色";
}