先执行静态代码块内容,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用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-------");
}
}
运行结果