代码块基本介绍
代码块又称为初始化块,属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显示调用,而是加载类时,或创建对象是隐式调用
基本语法
[修饰符]{
代码
};
注意:
1.修饰符可选写,但只能写static
2.代码块分为两类,使用static叫静态代码块,没加修饰的叫非静态代码块
3.逻辑语句可以为任何逻辑语句(输入,输出,方法调用,循环,判断等)
4.;可以写上也可以省略
代码块的好处
1.相当于另外一种形式的构造器(对构造器的补充机制),以可做初始化操作
2.如果多个构造器中都有重复的语句,可以抽取到初始化代码块中,提高代码的重用性
package com.hspedu.static_.coldblock_;
public class CodeBlock01 {
public static void main(String[] args) {
Movie jack_an_rose = new Movie("Jack an Rose");
}
}
class Movie{
private String name;
private double price;
private String director;
//3个构造器重载
//当我们不管先调用哪个构造器,创建对象,都会先调用代码块中的类容
{
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;
}
}
当我们不管先调用哪个构造器,创建对象,都会先调用代码块中的类容
代码块的使用注意事项
1.static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,如果是普通代码块,每创建一个对象,就执行
2.类什么时候被加载?
a.创建对象实例(new)
b.创建子类对象实例,父类也会被加载
c.使用类的静态成员时
3.普通的代码块,在创建对象实例时,会被隐式的调用
被创建一次就会调用一次
如果只是使用类的静态成员时,普通代码块并不会执行
4.在创建一个对象时,在一个类 调用顺序是:
a.调用静态代码块和静态属性初始化(静态代码块和静态属性初始化调用的优先级一样,如果右多个静态代码块和多个静态变量初始化,则按照它们定义的顺序调用)
b.调用普通代码块和普通属性的初始化(普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按照定义顺序调用)
c.静态代码块和静态属性初始化优先级高于普通代码块和普通属性初始化
d.构造器最后被执行
5.构造方法(构造器)的最前面其实是隐含了super() 和 调用普通代码块。静态相关的代码块,属性初始化,在类加载时,就执行完毕,因此是优先于 构造器和普通代码块执行的
class A{
public A(){//构造器
//这里有隐藏的执行要求
//super();
//调用普通代码块
System.out.println("ok");
}
}
6.创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下
a.父类的静态代码块和静态属性(优先级一样,按照定义顺序执行)
b.子类的静态代码块和静态属性
c.父类的普通代码块和普通属性初始化
d.父类的构造方法
e.子类的普通代码块和普通属性初始化
f.子类的构造方法
7.静态代码块只能直接调用静态成员,普通代码块可以调用任意成员