代码块如下所示
class Movie{
private String name;
private double price;
private String director;
{//代码块
System.out.println("电影屏幕打开");
System.out.println("广告开始");
System.out.println("电影还未开始");
}
静态代码块就是在代码块前加了static,如下所示
class AA{
{
System.out.println("AA 普通代码块1被执行...");
}
static{//静态代码块
System.out.println("AA 静态代码块1被执行...");
}
}
关于静态属性,普通属性也是同代码块一样,区别在于有没有static
static代码块是在类加载时,执行的,而且只会执行一次;
类什么时候被加载?
①创建对象实例时;
②创建子类对象实例,父类也会被加载;
③使用类的静态成员时。
创建一个类时,在一个类调用顺序是(先静态再普通)
①调用静态代码块和静态属性初始化(两个优先级一样,如果出现多个则按照定义顺序调用);
②调用普通代码块和普通属性(优先级一样,出现多个按照定义顺序调用);
③调用构造器。
创建一个子类对象时(继承关系)调用顺序
①父类的静态代码块和静态属性;
②子类静态代码块和静态属性;
③父类普通代码块和普通属性初始化;
④父类构造方法;
⑤子类普通代码块和普通属性初始化;
⑥子类的构造方法。
最后附上代码可以自己去运行 一下
public class CodeBlockDetail01 {
public static void main(String[] args) {
//类加载情况举例(static只能执行一次)
//1.创建对象实例(new)
//AA aa = new AA();
//2.创建子类对象实例,父类也会被加载
BB bb = new BB();
//3.使用类的静态成员时(静态属性,静态方法)
System.out.println(cat.n1);
// cat cat = new cat();
//static代码块是在类加载时,执行的,而且只会执行一次;
// DD dd1 = new DD();
// DD dd2 = new DD();
//普通代码块在创建对象实例时会被隐式调用。
//被创建一次就会被调用一次
//如果只是使用类的静态成员时,普通代码块并不会执行
System.out.println(DD.n1);
}
}
class DD{
public static int n1 = 100;
static {
System.out.println("DD 静态代码块1被执行...");
}
//普通代码块,在new对象时,被调用,而且是每创建一个对象就执行一次
{
System.out.println("DD 普通代码块2被执行...");
}
}
class animal{
static {
System.out.println("animal 静态代码块1被执行...");
}
}
class cat extends animal{
public static int n1 = 999;//静态属性
//静态代码块
static {
System.out.println("cat 静态代码块1被执行...");
}
}
class AA{
{
System.out.println("AA 普通代码块1被执行...");
}
static{
System.out.println("AA 静态代码块1被执行...");
}
}
class BB extends AA{
static{
System.out.println("BB 静态代码块1被执行...");
}
}



