代码块
1.代码块(初始化块):属于类的一个成员,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来,
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通对象会类显式调用,而是加载类时,或创建对象时隐式调用。
2.基本语法
【修饰符】{
代码
};
注:(1)修饰符 可选,要写的话,也只能写static
(2)代码块分为两类,有static修饰的叫静态代码块,没有的叫普通代码块。
(3)逻辑语句可以为任何逻辑语句(和方法一样)
(4);号可以写上,也可以省略。
3.作用
(1)相当于对构造器的补充机制
(2)使用场景:如果多个构造器中有重复的语句,可以抽取到代码块中,提高代码复用性。
(3)快速入门
package com.hspedu.codeblock_;
public class CodeBlock01 {
public static void main(String[] args) {
Movie movie = new Movie("你好,李焕英"); System.out.println("===============");
Movie movie2 = new Movie("唐探 3", 100, "陈思诚");
}
}
class Movie {
private String name; private double price; private String director;
//3 个构造器-》重载
//老韩解读
//(1) 下面的三个构造器都有相同的语句
//(2) 这样代码看起来比较冗余
//(3) 这时我们可以把相同的语句,放入到一个代码块中,即可
//(4) 这样当我们不管调用哪个构造器,创建对象,都会先调用代码块的内容
//(5) 代码块调用的顺序优先于构造器..
{
System.out.println("电影屏幕打开...");
System.out.println("广告开始...");
System.out.println("电影正是开始...");
};
public Movie(String name) { System.out.println("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) {
System.out.println("Movie(String name, double price, String director) 被调用..."); this.name = name;
this.price = price; this.director = director;
}
}
4.代码块使用细节
(1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行。
(2)类什么时候被加载
1.创建对象实例时(new)
2.创建子类对象实例,父类也会被加载
3.使用类的静态成员时(静态属性,静态方法)
(3)普通代码块,在创建对象实例时,会被隐式的调用。
创建一次就调用一次。如果使用类的静态成员时,普通代码块不会被执行。
小结:1.static代码块是类加载时,执行,只会执行一次。
2.普通代码块是在创建对象时调用的,创建一次就调用一次。
3.类加载的3种情况要背
5.创建一个对象的时候,在一个类 调用顺序是:(重点)
(1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用优先级是一样的,按他们的定义的顺序调用)
(2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化优先级一样,按定义顺序调用)
(3)调用构造方法
6.构造器的最前面其实隐含了super()和调用普通代码块。
例如
class A{
pubic A(){
//(1)super();
//(2)调用普通代码块
System.out.println(" ....");
}
}
7.创建一个子类对象时(继承关系),他们的静态代码块。静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下。(面试题)
(1)父类的静态代码块和静态属性(优先级一样,按定义顺序)
(2)子类的静态代码块和静态属性(优先级一样,按定义顺序)
(3)父类的普通代码块和普通属性初始化(优先级一样,按定义顺序)
(4)父类的构造器
(5)子类的普通代码块和普通属性初始化(优先级一样,按定义顺序)
(6)子类的构造器
例子中:
//1.类加载 //(1)类加载 先加载父类AAAA,再加载子类BBBB //(2)创建对象 子类构造器开始 //
8.静态代码块只能调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。