代码块如下所示
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被执行..."); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)