章10——面向对象编程(高级部分)——代码块

代码块/初始化块与方法的区别
无方法名、返回、参数,仅方法体。
不用通过对象或类显示调用,加载类/创建对象时隐式调用。

代码块的好处

总结:在有多个构造器的类中,可以把每个构造器中都需要有的重复语句抽取出来单独作为代码块,大大提高了程序的复用性。

public class CodeBlock01 {
    public static void main(String[] args) {
        Movie a = new Movie("a");
        Movie b = new Movie("b", 12);
    }

}

class Movie{
    private String name;
    private double price;
    private String director;

    {
        System.out.println("电影屏幕打开...");
        System.out.println("广告开始...");
        System.out.println("电影正式开始...");
    }

    public Movie(String name) {
        this.name = name;
    }

    public Movie(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Movie(String name, double price, String director) {
        this.name = name;
        this.price = price;
        this.director = director;
    }
}

代码块注意事项:
很重要!多复习!

注意!当调用到子类的static代码块时,其父类的static代码块也会被调用。(因为子类加载时其父类也会加载)

由上可以总结:类的加载和new实例之间是有重叠部分,且不相关的两件事情。
小结:
1.static代码块在类加载时执行,只执行一次。
2.非静态代码块在创建对象时调用,创建一次,调用一次。


代码块在构造器之前被调用。
示例代码如下:

public class CodeBlock02 {
    public static void main(String[] args) {
        A1 a1 = new A1();
    }
}

class A1{
    private static int n1 = getVal1();
    private int n2 = getVal2();
    {
        System.out.println("1普通代码块");
    }
    static{
        System.out.println("1static");
    }
    public static int getVal1(){
        System.out.println("val1");
        return 10;
    }
    public int getVal2(){
        System.out.println("val2");
        return 30;
    }
}

输出如下:

val1
1static
val2
1普通代码块

当涉及到继承关系时的顺序:
父类加载->子类加载->父类构造->子类构造

有关最后一条:static代码块本质上也是一个static方法,普通代码块同理。

posted @ 2024-09-03 16:43  gknives  阅读(2)  评论(0编辑  收藏  举报