类的加载顺序(例题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的加载顺序(例题)相关的知识,希望对你有一定的参考价值。

1、很重要!!!    
例子:
package Servlet.day0811.am;
public class StaticTest {
	static StaticTest st=new StaticTest();
	static{
		System.out.println("静态代码块");
	}
	public StaticTest(){
		System.out.println("构造器");
		System.out.println(st);
		m1();
	}	
	public static void m1(){
		System.out.println("m1静态方法");
		System.out.println(st);
	}
	{
		System.out.println("普通代码块");
	}
	public static void main(String[] args) {
		System.out.println("main开始");
		StaticTest.m1();
		System.out.println("main结束");
	}
}
-------------------------------------结果如下-------------------------------------
普通代码块    (先加载普通代码块)
构造器        (再加载构造器)
null          (输出构造器中的st,此时并未加载静态属性,所以输出null)
m1静态方法    (构造器中的m1方法,输出m1静态方法)
null          (m1方法中的st,此时st仍然未被加载)
静态代码块    (加载静态代码块)
main开始      (main方法开始,st在这时候被加载(分配内存))
m1静态方法    (调用静态方法m1)
[email protected]  (st已经被加载过了,所以为对象对应的地址)
main结束      (main方法结束)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、
    1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
    2、只有在调用new方法时才会创建类的实例
    3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类
 的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法
    4、类实例销毁时候,首先销毁子类部分,再销毁父类部分
public class Dervied extends Base{
	private String name="dervied";
	public Dervied(){
		System.out.println(new Base().i);
		tellName();
		printName();
	}
	static{
		System.out.println("子类静态代码块");
	}
	public void tellName(){
		System.out.println("Dervied tell name : "+name);
	} 
	public void printName(){
		System.out.println("Dervied print name : "+name);
	}
	public static void main(String[] args) {
		new Dervied();
	}
}
class Base{
	public int i=99;
	private String name="111";
	static{
		System.out.println("父类静态代码块");
	}
	{
		System.out.println("父类非静态代码块");
	}
	public Base(){
		tellName();
		printName();
	}
	public void tellName(){
		System.out.println("Base tell name : "+name);
	} 
	public void printName(){
		System.out.println("Base print name : "+name);
	}
}
-------------------------------------结果如下-------------------------------------

父类静态代码块

子类静态代码块

父类非静态代码块

Dervied tell name : null

Dervied print name : null

父类非静态代码块

Base tell name : 111

Base print name : 111

99

Dervied tell name : dervied

Dervied print name : dervied

++++++++++++++++++++++++++做如下修改++++++++++++++++++++++++++++

将main方法里面new Dervied( ) 改为:System.out.println("hello");

结果为:        

    父类静态代码块

    子类静态代码块

    hello


============================================================

3、

class Farther{

public static int a=2;

public int b=3;

{

System.out.println("非静态代码块:b="+b);

}

static{

a=4;

System.out.println("静态代码块:a="+a);

}

public Farther(){

System.out.println("父类构造器");

this.s();

}

public void s(){

System.out.println("父类方法");

}

}

public class Son extends Farther{

public Son(){

System.out.println("子类构造器");

}

public static void main(String[] args) {

Farther f=new Son();

f.s();

}

public void s(){

super.s();

System.out.println("子类方法");

}

}

-------------------------------------结果如下-------------------------------------

静态代码块:a=4

非静态代码块:b=3

父类构造器

父类方法

子类方法

子类构造器

父类方法

子类方法

==========================================================

4、

public class InitializeDemo {

private static int k=1;

private static InitializeDemo t1=new InitializeDemo("t1");

private static InitializeDemo t2=new InitializeDemo("t2");

private static int i=print("1");

private static int n=99;

static{

print("静态代码块");

}

private int j=print("j");

{

print("非静态代码块");

}

public InitializeDemo(String str){

System.out.println(k++ + " : "+ str +"  i="+i+"  n="+n);

++i;

++n;

}

public static int print(String str){

System.out.println(k++ + " : "+ str +"  i="+i+"  n="+n) ;

++n;

return ++i;

}

public static void main(String[] args) {

new InitializeDemo("init");

}

}

-------------------------------------结果如下-------------------------------------

1 : j  i=0  n=0

2 : 非静态代码块  i=1  n=1

3 : t1  i=2  n=2

4 : j  i=3  n=3

5 : 非静态代码块  i=4  n=4

6 : t2  i=5  n=5

7 : 1  i=6  n=6

8 : 静态代码块  i=7  n=99

9 : j  i=8  n=100

10 : 非静态代码块  i=9  n=101

11 : init  i=10  n=102


本文出自 “Java学习” 博客,请务必保留此出处http://12181171.blog.51cto.com/12171171/1958973

以上是关于类的加载顺序(例题)的主要内容,如果未能解决你的问题,请参考以下文章

java加载类的顺序

java类的加载顺序和实例化顺序(Demo程序)

Java 的类加载顺序

java类的加载以及初始化顺序 .

Java类加载

Java类加载