public class ClassTest1 {
public static void main(String[] args) {
System.out.println(SubClass.num);
// SubClass subClass=new SubClass();
// System.out.println(SubClass.num);
}
}
class SubClass extends SuperClass{
static {
System.out.println(111111111);
}
}
class SuperClass{
static{
System.out.println(2222222);
}
static int num=100;
}
Java什麼時候會觸發類初始化及原理(詳解)Java是如何加載并初始化的
2.通過數組定義來引用類,也不會觸發類的初始化;例如:People[] ps = new People[100];
public class ClassTest2 {
public static void main(String[] args) {
ArrayClass[] why=new ArrayClass[10];
}
}
class ArrayClass{
static {
System.out.println(1111);
}
}
Java什麼時候會觸發類初始化及原理(詳解)Java是如何加載并初始化的
3.引用一個類的常量也不會觸發類的初始化
public class ClassTest3 {
public static void main(String[] args) {
System.out.println(ConstVariable.TEL);
}
}
class ConstVariable{
static {
System.out.println(1111);
}
public static final String TEL="10086";
}
public class Insect {
private int i = 9;
protected int j;
protected static int x1 = printInit("static Insect.x1 initialized");
Insect() {
System.out.println("基類構造函數階段: i = " + i + ", j = " + j);
j = 39;
}
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
protected int k = printInit("Beetle.k initialized");
protected static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
Beetle b = new Beetle();
}
}
public class Base {
Base() {
preProcess();
}
void preProcess() {
}
}
public class Derived extends Base {
public String whenAmISet = "set when declared";
@Override
void preProcess() {
whenAmISet = "set in preProcess";
}
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.whenAmISet);
}
}
public class Derived extends Base {
// 準備階段指派 whenAmISet=null
public String whenAmISet = "set when declared";
public Derived() {
System.out.println("do son constructor");
}
@Override
void preProcess() {
System.out.println("do son process");
System.out.println("whenAmISet:" + whenAmISet);
whenAmISet = "set in preProcess";
System.out.println("whenAmISet:" + whenAmISet);
System.out.println("set in preProcess end");
}
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.whenAmISet);
}
}