优先执行顺序:静态代码块>构造代码块>构造方法;

以下代码的输出结果是什么?

public class HelloB extends HelloA 
{
 public HelloB()
 {
 }
 {
     System.out.println("I’m B class");
 }
 static
 {
     System.out.println("static B");
 }
 public static void main(String[] args)
 {
     new HelloB();
 }
}
class HelloA
{
 public HelloA()
 {
 }
 {
     System.out.println("I’m A class");
 }
 static
 {
     System.out.println("static A");
 }
}

结果:

当涉及到继承时,按照如下顺序执行:
1、执行父类的静态代码块 
static {
        System.out.println("static A");
    }

输出:static A

2、执行子类的静态代码块
static {
        System.out.println("static B");
    }
输出:static B
3、执行父类的构造代码块
{
        System.out.println("I’m A class");
    }
输出:I'm A class
4、执行父类的构造函数
public HelloA() {
    }
输出:无
5、执行子类的构造代码块
{
        System.out.println("I’m B class");
    }
输出:I'm B class
6、执行子类的构造函数
public HelloB() {
    }
输出:无

那么,最后的输出为:
static A
static B
I'm A class

I'm B class

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

优先执行顺序:静态代码块>构造代码块>构造方法;
静态代码块:
是在类的加载过程的第三步初始化的时候进行的,主要目的是给类变量赋予初始值。
构造代码块:是独立的,必须依附载体才能运行,Java会把构造代码块放到每种构造方法的前面,用于实例化一些共有的实例变量,减少代码量。
构造方法:用于实例化变量。
静态代码块是类级别的,构造代码块、构造方法是实例级别的,自然静态代码块要优先构造代码块、构造方法.
对子类的主动使用会导致对其父类得主动使用,所以尽管实例化的是子类,但也会导致父类的初始化和实例化,且优于子类执行。


你可能感兴趣的:(笔记)