代码块/初始化块与方法的区别:
无方法名、返回、参数,仅方法体。
不用通过对象或类显示调用,加载类/创建对象时隐式调用。
代码块的好处:
总结:在有多个构造器的类中,可以把每个构造器中都需要有的重复语句抽取出来单独作为代码块,大大提高了程序的复用性。
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方法,普通代码块同理。