java 类 加载 初始化_java中类的初始化和加载
最近在閱讀孫衛琴的java面向對象一書中,看到對java中類的初始化和加載中的論述比較系統,故筆記之
1)類的初始化,JAVA在初始化一個類時,以下步驟
A 假如類存在直接的父類,并且這個父類還沒有初始化,則先初始化直接的父類
B? 假如類存在初始化的語句,那么直接執行這些初始化語句
比如
package init;
class Base{
static int a=1;
static{
System.out.println("init Base");
}
}
class Sub extends Base{
static int b=1;
static{
System.out.println("init Sub");
}
}
public class InitTester{
static{System.out.println("init InitTester");}
/*
public static void main(String args[]){
System.out.println("b="+Sub.b);? //執行這行代碼時,先依次初始化Base類和Sub類
}
*/
輸出:
init InitTester
init Base
init Sub
b=1
假如換成下面這樣
public static void main(String args[]){
Base base;? //不會初始化Base類
System.out.println("After defining base");
base=new Base();? //執行這行代碼時,初始化Base類
System.out.println("After creating an object of Base");
System.out.println("a="+base.a);
System.out.println("b="+Sub.b);? //執行這行代碼時,僅僅初始化Sub類
}
}
輸出
init InitTester
After defining base
init? Base
After creating an object of Base
a=1
init Sub
b=1
2) 類的初始化時機
A 對于final類型的,如果在編譯時就能計算出變量的值,則不會導致類的初始化,如下
class Tester {
public static final int a=2*3;
static? {
System.out.println("hello");?? ..............
}
}
public class Sample
{
public static void main(String args[])
{? System.out.println("a="+Tester.a);
}
}
2)? package initbase;
class Base{? static int a=1;? static{??? System.out.println("init Base");? }? static void method(){??? System.out.println("method of Base");? }}class Sub extends Base{? static{??? System.out.println("init Sub");? }}public class Sample{? public static void main(String args[]){??? System.out.println("a="+Sub.a);? //僅僅初始化Base類??? Sub.method();? ? }}由于靜態變量a和靜態方法method()在 base父類中定義,所以僅初始化Base類,沒初始化SUB類打印結果為init Basea=1method of Base這樣的話,如果在調用Tester.a時,不會輸出hello,
總結
以上是生活随笔為你收集整理的java 类 加载 初始化_java中类的初始化和加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring cloud微服务_年后进大
- 下一篇: c语言游戏菜单栏,C语言小游戏之打砖块