0
点赞
收藏
分享

微信扫一扫

代码块(三)

有态度的萌狮子 2022-01-20 阅读 60

Java代码块细节(二)

4、创建一个对象时,在一个类调用顺序是:(重点,难点):

1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)。	
package com.z.codeblock;

public class CodeBockDetail02 {
    public static void main(String[] args) {
        A a = new A();
    }
}

class A{
    //静态属性初始化
    private static int n1 = getN1();

    static{
        System.out.println("A静态代码块01...");
    }
    public static int getN1(){
        System.out.println("getN1被调用~~~");
        return 10;
    }
}


输出:

getN1被调用~~~
A静态代码块01...
2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)。

3)调用构造方法。
package com.z.codeblock;

public class CodeBockDetail02 {
    public static void main(String[] args) {
        A a = new A();
    }
}

class A{
    public A(){
        System.out.println("构造器A()被调用~~~");
    }
    private int n2 = getN2();//普通属性初始化
    {
        System.out.println("A普通代码块01...");
    }
    //静态属性初始化
    private static int n1 = getN1();

    static{
        System.out.println("A静态代码块01...");
    }
    public static int getN1(){
        System.out.println("getN1被调用~~~");
        return 10;
    }
    public static int getN2(){
        System.out.println("getN2被调用~~~");
        return 10;
    }
}


输出:

getN1被调用~~~
A静态代码块01...
getN2被调用~~~
A普通代码块01...
构造器A()被调用~~~

5、构造器的最前面其实隐含了super()和调用普通代码块,静态相关的代码块,属性初始化,在类加载时就执行完毕,因此是优先于构造器和普通代码块执行的。

class A{
  //这里由隐藏的执行要求
  //(1)super();
  //(2)调用普通代码块
  System.out.println("ok");
}
package com.z.codeblock;

public class CodeBockDetail03 {
    public static void main(String[] args) {
        new BBB();
    }
}
class AAA{
    {
        System.out.println("AAA的普通代码块~~~");
    }
    public AAA(){
        System.out.println("AAA()构造器被调用~~~");
    }
}
class BBB extends AAA{
    {
        System.out.println("BBB的普通代码块~~~");
    }
    public BBB(){
        System.out.println("BBB()构造器被调用~~~");
    }
}

输出:

AAA的普通代码块~~~
AAA()构造器被调用~~~
BBB的普通代码块~~~
BBB()构造器被调用~~
举报

相关推荐

0 条评论