深入理解java虛擬機器(三)(一個類載入器只初始化一次類物件,不同類載入器可以對同一類物件進行初始化)
class Final{
public static final int x=6/3;//此處x在編譯時能計算出值,是編譯時的常量,則System.out.println(Final.x);直接輸出值,不再執行下面static(前提是final)
static{
System.out.println("Final ");
}
}
public class Test2 {
public static void main(String[] args) {
System.out.println(Final.x);
}
}
//*************************************
2
//======================================
import java.util.Random;
class FinalTest2{
public static final int x=new Random().nextInt(100);//執行時才確定x的值,編譯時變數
static{
System.out.println("FinalTest2");
}
}
public class Test3 {
public static void main(String[] args) {
System.out.println(FinalTest2.x);
}
}
//****************************************
FinalTest2
10
//**********************************************************
package com.ygl;
class Parent{
static int a=3;
static {
System.out.println("Parent ");
}
}
class Children extends Parent{
static int b=4;
static{
System.out.println("Children extends Parent");
}
}
public class Test4 {
static {
System.out.println("Test4");
}
public static void main(String[] args) {
System.out.println(Children.b);
}
}
//********************************
Test4
Parent
Children extends Parent
4
//****************************************
package com.ygl;
class Parent2{
static int a=3;
static {
System.out.println("Parent ");
}
}
class Children2 extends Parent2{
static int b=4;
static{
System.out.println("Children extends Parent");
}
}
public class Test5 {
static {
System.out.println("Test5");
}
public static void main(String[] args) {
Parent2 parent;
System.out.println("------------------------");
parent =new Parent2();
System.out.println(Parent2.a);
System.out.println(Children2.b);
}
}
//******************************
Test5
------------------------
Parent
3
Children extends Parent
4
//*******************************************
package com.ygl;
/**
* 只有當程式訪問的靜態變數或靜態方法確實在當前類或當前介面中定義時,才可以認為是對類或或介面的主動使用
* @author lenovo
*
*/
public class Test6 {
public static void main(String[] args) {
System.out.println(Children3.a);
Children3.doSomething();
}
}
class Parent3{
static int a=3;
static {
System.out.println("Parent ");
}
static void doSomething(){
System.out.println("doSomething");
}
}
class Children3 extends Parent3{
static{
System.out.println("Children extends Parent");
}
}
//******************************
Parent
3
doSomething