您的位置:首页 > 编程语言 > Java开发

java中的几种代码块

2017-03-12 00:15 67 查看
今天找工作笔试碰见一道有意思的题目,问题很简单:

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加载类的时候执行的,而且静态代码块执行且仅执行一次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息