java中的几种代码块

今天找工作笔试碰见一道有意思的题目,问题很简单:

public class A {

	public A() {
		System.out.println("调用了A的构造函数");
	}
	{System.out.println("A的代码块");}
	static{System.out.println("A的静态代码块");}
}


public class B extends A {

	public B() {
		System.out.println("调用了B的构造函数");
	}
	{System.out.println("B的代码块");}
	static{System.out.println("B的静态代码块");}
	
	public static void main(String[] args) {
		B b = new B();
	}
}
请问执行main的结果~
执行的结果应该为:
A的静态代码块
B的静态代码块
A的内置代码块
调用了A的构造函数
B的内置代码块
调用了B的构造函数


一下没想起来,事后复习了下,

这道题目涉及到java的几种代码块:普通代码块、构造代码块、静态代码块和父子继承的关系

一、我们先来看看这三种代码块:

//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。

其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

下面我们来分别运行实验

1 普通代码块

//普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
public class BasicCodeblock{
    public static void main(String[] args){
        
          {
            int x=3;
            System.out.println("1,普通代码块内的变量x="+x);    
          }
          
          int x=1;
          System.out.println("主方法内的变量x="+x);
          
          {
             int y=7;
             System.out.println("2,普通代码块内的变量y="+y);    
          }
        }
  }
  
/*
  运行结果:
	1,普通代码块内的变量x=3
	主方法内的变量x=1
	2,普通代码块内的变量y=7
*/


2 构造代码块

//构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
public class ConstructCodeBlock {
	{
		System.out.println("第一代码块");
	}


	public ConstructCodeBlock() {
		System.out.println("构造方法");
	}


	{
		System.out.println("第二构造块");
	}


	public static void main(String[] args) {
		new ConstructCodeBlock();
		System.out.println("=============");
		new ConstructCodeBlock();
		System.out.println("=============");
		new ConstructCodeBlock();


	}
}
/*
运行结果:
	第一代码块
	第二构造块
	构造方法
	=============
	第一代码块
	第二构造块
	构造方法
	=============
	第一代码块
	第二构造块
	构造方法
*/

3 静态代码块

//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
//如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
//注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。

public class StaticCodeBlock {
	{
		System.out.println("Code的构造块");
	}

	static {
		System.out.println("Code的静态代码块");
	}

	public StaticCodeBlock() {
		System.out.println("Code的构造方法");
	}
}

class StaticCodeBlock2 {
	{
		System.out.println("Code2的构造块");
	}

	static {
		System.out.println("Code2的静态代码块");
	}

	public StaticCodeBlock2() {
		System.out.println("Code2的构造方法");
	}

	public static void main(String[] args) {
		System.out.println("Code2的主方法");
		System.out.println("=============");
		new StaticCodeBlock();
		System.out.println("=============");
		new StaticCodeBlock();
		System.out.println("=============");
		new StaticCodeBlock2();
		System.out.println("=============");
		new StaticCodeBlock2();
		System.out.println("=============");
	}
}
/*
运行结果:
	Code2的静态代码块
	Code2的主方法
	=============
	Code的静态代码块
	Code的构造块
	Code的构造方法
	=============
	Code的构造块
	Code的构造方法
	=============
	Code2的构造块
	Code2的构造方法
	=============
	Code2的构造块
	Code2的构造方法
	=============
 */
二、再来讨论父子继承的关系

当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:
父类静态代码块 > 子类静态代码块 Java虚拟机加载类时,就会执行该块代码。


父类构造函数 > 子类构造函数 (先有父亲,后有孩子)


如果是多级继承关系的话,高层的父类首先执行,然后依次递减


总结:静态优先执行,父类优先于子类执行
         静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次






猜你喜欢

转载自blog.csdn.net/wokuailewozihao/article/details/61470116
今日推荐