java初始化块(2)

1、java在初始化的时候首先执行初始化静态代码块(只执行一次),然后非静态代码块,然后构造方法。

2、在各个代码块中顺序执行。

3、执行顺序:父类static -》子类static-》父类非static-》父类构造-》子类非static-》子类构造

4、对于new A(new B());先执行A的static,在执行B的所有,最后执行A的非静态和构造

举例:

1、无继承,无层次

public class A {
	static {
		System.out.println("a-static1");
		System.out.println("a-static2");
	}
	{
		System.out.println("a-not-static1");
		System.out.println("a-not-static2");
	}
	public A() {
		System.out.println("A构造方法1");
		System.out.println("A构造方法2");
	}
 
        public static void main(String[] args) {
		A a = new A();
	}
}
}

结果:

a-static1
a-static2
a-not-static1
a-not-static2
A构造方法1
A构造方法2

2、有继承,无层次

public class A {
	static {
		System.out.println("a-static1");
		System.out.println("a-static2");
	}
	{
		System.out.println("a-not-static1");
		System.out.println("a-not-static2");
	}
	public A() {
		System.out.println("A无参构造方法1");
		System.out.println("A无参构造方法2");
	}
	
	public A(B b) {
		System.out.println("A有参构造方法1");
		System.out.println("A有参构造方法2");
	}
}
public class B extends A{
	static {
		System.out.println("B-static");
	}
	{
		System.out.println("B-not-static");
	}
	public B() {
		System.out.println("B-construct");
	}
}
public class Test {
public static void main(String[] args) {
		new B();
	}
}

 结果:

a-static1
a-static2
B-static
a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2
B-not-static
B-construct

3、(1)无继承,有层次 

public class A {
	static {
		new B();
		System.out.println("a-static1");
		System.out.println("a-static2");
	}
	{
		System.out.println("a-not-static1");
		System.out.println("a-not-static2");
	}
	public A() {
		System.out.println("A无参构造方法1");
		System.out.println("A无参构造方法2");
	}
	
	public A(B b) {
		System.out.println("A有参构造方法1");
		System.out.println("A有参构造方法2");
	}
}
public class B {
	static {
		System.out.println("B-static");
	}
	{
		System.out.println("B-not-static");
	}
	public B() {
		System.out.println("B-construct");
	}
}
public class Test {
public static void main(String[] args) {
	new A();
	}
}

结果:先按照规则执行A的静态化块 ,在A的静态化块里先执行new B();所以执行完B的静态、非静态、构造之后才会继续执行A静态化块里剩余的,然后执行A的非静态和构造。

B-static
B-not-static
B-construct
a-static1
a-static2
a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2

3、(2)

public class A {
	static {
		new A();
		System.out.println("a-static1");
		System.out.println("a-static2");
	}
	{
		System.out.println("a-not-static1");
		System.out.println("a-not-static2");
	}
	public A() {
		System.out.println("A无参构造方法1");
		System.out.println("A无参构造方法2");
	}
	
	public A(B b) {
		System.out.println("A有参构造方法1");
		System.out.println("A有参构造方法2");
	}
}
public class Test {
public static void main(String[] args) {
	new A();
	}
}

结果分析:new A();-》

1、执行A的静态化块 

    (1)new A();-》

               1>A的静态化块只执行一次,在外层执行过了,所以在内层跳过

               2>执行A的非静态化块

               3>执行A的无参构造函数

    (2)System.out.println("a-static1");

    (3)System.out.println("a-static2");

2、执行A的非静态化块

3、执行A的无参构造函数

得到结果如下:

a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2
a-static1
a-static2
a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2

4、有层次有继承

public class A {
	static {
		new B();
		System.out.println("a-static1");
		System.out.println("a-static2");
	}
	{
		System.out.println("a-not-static1");
		System.out.println("a-not-static2");
	}
 
	public A() {
		System.out.println("A无参构造方法1");
		System.out.println("A无参构造方法2");
	}
 
	public A(B b) {
		System.out.println("A有参构造方法1");
		System.out.println("A有参构造方法2");
	}
}
public class B extends A{
	static {
		System.out.println("B-static");
	}
	{
		System.out.println("B-not-static");
	}
	public B() {
		System.out.println("B-construct");
	}
}
public class Test {
public static void main(String[] args) {
	new A();
	}
}

结果分析:

new A();-》

1、执行A的static

     (1)new B(); B为A的子类-》

              1>A的static在外层执行过了,所以跳过

              2>执行B的static

              3>执行A的非static

              4>执行A的构造

              5>执行B的非static

              6>执行B的构造

     (2)System.out.println("a-static1");

     (3)System.out.println("a-static2");

2、执行A的非static

3、执行A的无参构造

结果如下:

B-static
a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2
B-not-static
B-construct
a-static1
a-static2
a-not-static1
a-not-static2
A无参构造方法1
A无参构造方法2

5、将层次放在构造函数中  --》 new A(new B());先执行A的static,在执行B的所有,最后执行A的非静态和构造

public class Class1 {
	
	static {
		new Class2();
		System.out.println("666666666666666666");
	}
	{
		System.out.println("99999999999999999");
	}
	
	
	public Class1() {
		
		System.out.println("111111111111111111111");
	}
	
	public Class1(Class1 c1){
		System.out.println("==============");
	}
	
	public Class1(Class2 c2){
		System.out.println("++++++++++++++++++++");
	}
	
	public Class1(Class3 c3){
		System.out.println("---------");
	}
 
}
public class Class2 extends Class1{
 
}
public class Class3 extends Class2{
 
}
public class Test {
public static void main(String[] args) {
		new Class1(new Class3());
	}
}
 

结果分析:

1、执行Class1的静态代码块

      (1)new Class2();  -->Class2继承了Class1

             Class1的静态执行过了,跳过

             执行Class2的静态

             执行Class1的非静态

             执行Class1的构造

             执行Class2的非静态

             执行Class2的构造

      (2)System.out.println("666666666666666666");

2、执行Class3的所有 -》Class3传递继承Class1(因为Class2没有任何信息,所以直接忽略)           

            Class1的静态执行过了,跳过

             执行Class3的静态

             执行Class1的非静态

             执行Class1的构造

             执行Class3的非静态

             执行Class3的构造   

3、执行Class1的非静态代码块

4、执行Class1的有参构造方法

结果如下:

99999999999999999
111111111111111111111
666666666666666666
99999999999999999
111111111111111111111
99999999999999999
---------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值