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

Java 静态语句块、语句块、构造函数执行顺序

2018-01-19 16:53 323 查看
先执行静态代码块内容,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

下面举几个实例

实例1:

父类HelloA

public class HelloA {
public HelloA() {
System.out.println("HelloA");
}

{
System.out.println("I'm A class");
}

static {
System.out.println("static A");
}
}


子类HelloB继承HelloA

public class HelloB extends HelloA {

public HelloB() {
System.out.println("HelloB");
}

{
System.out.println("I'm B class");
}

static {
System.out.println("static B");
}

public static void main(String[] args) {

System.out.println("-------main start-------");
new HelloB();
System.out.println("-------HelloA() start-------");
new HelloA();
System.out.println("-------main end-------");
}
}


运行结果为:



从结果可以看出,首先运行的是父类的static修饰的静态代码块,然后再运行子类静态代码块,接着开始运行main方法。new HelloB()执行该语句的时候首先调用的是父类的构造函数,然后再执行自己的构造函数,最后再执行new HelloA()只调用HelloA自身的构造函数。

实例2:

父类HelloA

package com.person.test;

public class HelloA {
public HelloA() {
System.out.println("HelloA");
}

{
System.out.println("I'm A class");
}

static {
System.out.println("static A");
}

public static void main(String[] args) {

System.out.println("-------main start-------");
new HelloB();
System.out.println("-------HelloA() start-------");
new HelloA();
System.out.println("-------main end-------");
}
}


子类HelloB

package com.person.test;

public class HelloB extends HelloA {

public HelloB() {
System.out.println("HelloB");
}

{
System.out.println("I'm B class");
}

static {
System.out.println("static B");
}

}


运行结果



因为这次启动函数Main方法是在父类HelloA里面,所以只会先执行A的静态语句,然后再执行new HelloB()的时候首先执行B类的静态语句,再实例化B

实例3:

父类HelloA

package com.person.test;

public class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } }


子类HelloB

package com.person.test;

public class HelloB extends HelloA {

public HelloB() {
System.out.println("HelloB");
}

{
System.out.println("I'm B class");
}

static {
System.out.println("static B");
}

}


启动类HelloC

package com.person.test;

public class HelloC {

public static void main(String[] args) {

System.out.println("-------main start-------");
new HelloB();
System.out.println("-------HelloA() start-------");
new HelloA();
System.out.println("-------main end-------");
}
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息