java虚拟机类的加载顺序
来源:互联网 发布:当当阅读器知乎 编辑:程序博客网 时间:2024/05/02 02:28
Parent.java
package book.oo.initorder;
public class Parent
...{
private int ix = 50;
private static int iz = getNext(30);
...{
System.out.println("Parent的初始化块");
int x = 100;
int y = 100; // getNext(100);
}
static
...{
System.out.println("Parent的静态初始化块");
int sx = 100;
int sy = getNext(100);
}
private int endall = 1;
public Parent()
...{
System.out.println("Parent的构造方法被调用");
}
public void display()
...{
System.out.println("Parent的display方法被调用");
System.out.print("ix=" + this.ix);
System.out.println("; iz=" + iz);
dispA();
}
public static void dispA()
...{
System.out.println("Parent的dispA()被调用");
}
public static int getNext(int base)
...{
System.out.println("Parent的getNext(int base)被调用");
return ++base;
}
/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()
...{
System.out.println("Parent的销毁方法被调用");
}
}
public class Parent
...{
private int ix = 50;
private static int iz = getNext(30);
...{
System.out.println("Parent的初始化块");
int x = 100;
int y = 100; // getNext(100);
}
static
...{
System.out.println("Parent的静态初始化块");
int sx = 100;
int sy = getNext(100);
}
private int endall = 1;
public Parent()
...{
System.out.println("Parent的构造方法被调用");
}
public void display()
...{
System.out.println("Parent的display方法被调用");
System.out.print("ix=" + this.ix);
System.out.println("; iz=" + iz);
dispA();
}
public static void dispA()
...{
System.out.println("Parent的dispA()被调用");
}
public static int getNext(int base)
...{
System.out.println("Parent的getNext(int base)被调用");
return ++base;
}
/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()
...{
System.out.println("Parent的销毁方法被调用");
}
}
Child.java
package book.oo.initorder;
public class Child extends Parent
...{
...{
System.out.println("Child的初始化块");
int bx = 100;
}
static
...{
System.out.println("Child的静态初始化块");
}
public Child()
...{
super();
System.out.println("Child的构造方法被调用");
}
public static void dispB()
...{
System.out.println("Child的dispB()被调用");
}
/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()
...{
System.out.println("Child的销毁方法被调用");
super.finalize();
}
}
public class Child extends Parent
...{
...{
System.out.println("Child的初始化块");
int bx = 100;
}
static
...{
System.out.println("Child的静态初始化块");
}
public Child()
...{
super();
System.out.println("Child的构造方法被调用");
}
public static void dispB()
...{
System.out.println("Child的dispB()被调用");
}
/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()
...{
System.out.println("Child的销毁方法被调用");
super.finalize();
}
}
ClassInitOrderTest.java
package book.oo.initorder;
public static void main(String[] args)
...{
System.out.println("不new对象,访问静态方法时的输出:");
Child.dispB();
System.out.println();
System.out.println("new对象,访问非静态方法时的输出:");
new Child().display(); //通知虚拟机进行垃圾回收 System.gc();
}
public static void main(String[] args)
...{
System.out.println("不new对象,访问静态方法时的输出:");
Child.dispB();
System.out.println();
System.out.println("new对象,访问非静态方法时的输出:");
new Child().display(); //通知虚拟机进行垃圾回收 System.gc();
}
以上代码摘抄自 JAVA JDK实例宝典,但书中关于JAVA类的加载部分有误,但代码可用来作测试,了解类的加载顺序
当一个类或它的子类调用它的静态方法时,如上面的Child.dispB(),虚拟机会先初始化类的静态变量,静态初始化块,其初始化顺序按照变量和初始化块在程序中的位置来决定,依次按排在前面到后面的顺序初始化,初始化静态变量和静态初始化块的顺序没有先后之分,但不会初始化烊的静态方法.如Child.dispB()这样访问类的静态方法的时候,不会初始化类的初始化块,构造函数,普通变量等.
当一个类new一个对象时,会按先父类后子类的顺序初始化类的,静态变量,静态初始化块,普通变量,普通初始化块,构造函数等.
- java虚拟机类的加载顺序
- Java虚拟机类加载顺序
- Java虚拟机类加载顺序
- Java虚拟机类加载顺序
- java虚拟机加载类顺序
- Java虚拟机类加载顺序
- Java虚拟机类加载顺序
- Java虚拟机类加载顺序
- Java虚拟机类加载顺序
- java虚拟机加载class的顺序
- java虚拟机加载class的顺序
- Java虚拟机类加载顺序研究
- Java虚拟机类加载顺序研究
- Java虚拟机类加载顺序研究
- 【java虚拟机系列】java中类与对象的加载顺序
- 如何显示JVM(JAVA虚拟机)类加载顺序
- 如何显示JVM(JAVA虚拟机)类加载顺序
- Java类的加载顺序
- Visual Studio 2005 SP1集成(整理前辈版本)
- MPC暴风影音清空播放历史记录
- 窦性心律不齐
- 函数指针的应用(2007-06-27)
- 七夕情人节,祝天下有情人终成眷属
- java虚拟机类的加载顺序
- 变量
- JS等比例缩放图片
- 上拉电阻下拉电阻的总结
- 电平转换总结(ZZ)
- problem 1107
- 方法和变量在继承时的覆盖与隐藏--摘抄JDK实例宝典
- sharePoint安装过程中创建数据库或应用程序池最好要用administrator帐号
- ASP.NET编程中的十大技巧