1、類別的主動引用,一定會發生類別的初始化。 當虛擬機器啟動,先初始化main方法所在的類別
實例化一個類別的物件
呼叫類別的靜態成員(除了final常數)和靜態方法
使用java.lang.reflect包的方法對類別進行反射調用
當初始化一個類,如果其父類沒有被初始化,則先會初始化它的父類
2、類別的被動引用,不會發生類別的初始化
當存取一個靜態域時,只有真正宣告這個域的類別才會被初始化。如:當透過子類別引用父類別的靜態變量,不會導致子類別初始化
透過數組定義類別引用,不會觸發此類的初始化
引用常數不會觸發此類別的初始化(常數在連結階段就存入呼叫類別的常數池中了)
實例
package com.volcano.reflection; //什么时候会发生类的初始化,除了第一个注释一直开着,其他都要独立打开测试,否则不准确 public class TestReflection3 { static { //1.虚拟机启动就会最先初始化main方法所在的类 会 System.out.println("main方法被加载"); } public static void main(String[] args) throws ClassNotFoundException { //2.实例化一个对象 会 //new Father(); //3.调用类的静态成员(除了final常量)和静态方法 会 //System.out.println(Son.a); //4.使用java.lang.reflect包的方法对类进行反射调用 会 //Class cls = Class.forName("com.volcano.reflection.Father"); //5.当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 会 //new Son(); //6.当访问一个静态域时,只有真正声明这个域的类才会被初始化 不会 //System.out.println(Father.a);//两个都是只加载Father //System.out.println(Son.a);//因为a是Father的静态成员 //7.通过数组定义类引用,不会触发此类的初始化 不会 //Father[] fathers = new Father[10]; //8.引用常量不会触发此类的初始化 不会 //System.out.println(Father.B); } } class Father{ static { System.out.println("Father被加载"); } static int a=100; static final int B = 300; } class Son extends Father{ static { System.out.println("Son被加载"); } static int c=200; }
以上是重寫: 有哪些方法可以引用Java類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!