代码块/属性及方法/构造器/继承关系 优先级

 总览

优先级:父静(代码块/属性/方法)>子静(代码块/属性/方法)>父普(代码块/属性/方法)>父构造器>子普代码块(代码块/属性/方法)>子构造器

 基本原理1

 

 代码实现1

public class Demo {
    public static void main(String[] args) {
        A a1=new A();//(1)A中静态代码块被调用(A类首次加载) (2)A中普通代码块被调用
        System.out.println("------------------");
        A a2=new A();//A中普通代码块被调用
        System.out.println("------------------");
        B b=new B();//(1)B中静态代码块被调用(B类首次加载) (2)A中普通代码块被调用 (3)B中普通代码块被调用
        System.out.println("------------------");
        System.out.println(A.age);//888
    }
}

class A{
    public static int age=888;
    static {
    System.out.println("A中静态代码块被调用");
    }

    {
        System.out.println("A中普通代码块被调用");
    }
}

class B extends A{
    static {
        System.out.println("B中静态代码块被调用");
    }

    {
        System.out.println("B中普通代码块被调用");
    }
}

运行结果1 

A中静态代码块被调用
A中普通代码块被调用
------------------
A中普通代码块被调用
------------------
B中静态代码块被调用
A中普通代码块被调用
B中普通代码块被调用
------------------
888

Process finished with exit code 0

基本原理2

代码实现2

public class Demo {
    public static void main(String[] args) {
        A a = new A();
    //(1)getN1被静态属性n1调用... (2)A中静态代码块被调用
    //(3)A中普通代码块被调用 (4)getN2被非静态属性n2调用...(5)A的无参构造器被调用
    }
}

class A {
    //静态属性/静态代码块 >优先级> 非静态属性/普通代码块 >优先级> 构造器

    //静态属性初始化的优先级和静态代码块一样,按照先后顺序来调用
    public static int n1 = getN1();

    static {//静态代码块
        System.out.println("A中静态代码块被调用");
    }

    //非静态属性初始化的优先级和普通代码块一样,也按照先后顺序来调用
    {//普通代码块
        System.out.println("A中普通代码块被调用");
    }

    public int n2 = getN2();

    public static int getN1() {
        System.out.println("getN1被静态属性n1调用...");
        return 100;
    }

    public static int getN2() {
        System.out.println("getN2被非静态属性n2调用...");
        return 200;
    }
    //构造器

    public A() {
        System.out.println("A的无参构造器被调用");
    }
}

运行结果2

getN1被静态属性n1调用...
A中静态代码块被调用
A中普通代码块被调用
getN2被非静态属性n2调用...
A的无参构造器被调用

Process finished with exit code 0

父子静态属性/代码块 >父普通代码/静态属性》父构造器

基本原理3

 

代码实现3

public class Demo {
    public static void main(String[] args) {
        B b = new B();
        //(1)A类的静态代码块被调用(2)B类的静态代码块被调用 父静>优先级>子静
        //(3)A类的普通代码块被调用(4)A类的构造器被调用...
        //(5)B类的普通代码块被调用(6)B类的构造器被调用...
        //优先级:父静(代码块/属性/方法)>子静(代码块/属性/方法)>父普(代码块/属性/方法)>父构造器>子普代码块(代码块/属性/方法)>子构造器
    }
}

class A {
    static {
        System.out.println("A类的静态代码块被调用");
    }

    {
        System.out.println("A类的普通代码块被调用");
    }

    public A() {
        //(1)super();
        //(2)调用本类的普通代码块
        System.out.println("A类的构造器被调用...");
    }
}

class B extends A {
    static {
        System.out.println("B类的静态代码块被调用");
    }

    {
        System.out.println("B类的普通代码块被调用");
    }

    public B() {
        //(1)super();
        //(2)调用本类的普通代码块
        System.out.println("B类的构造器被调用...");
    }
}

运行结果3

A类的静态代码块被调用
B类的静态代码块被调用
A类的普通代码块被调用
A类的构造器被调用...
B类的普通代码块被调用
B类的构造器被调用...

Process finished with exit code 0

基本原理4

IDEA提示

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值