类的成员之四:代码块的使用
代码块,又称初始化块,用一对大括号表示{ 方法体 }。
1、代码块的作用:用来初始化类或对象
2、代码块如果有修饰的话,只能使用static。
3、分类:分为静态代码块和非静态代码块。
4、静态代码块
--内部可以有输出语句
--随着类的加载而自动执行,只会执行一次。
--作用:初始化类的信息
--如果定义了多个静态代码块,则按照声明的先后顺序执行
--静态代码块的执行要优先于非静态代码块的执行
--静态代码块内只能调用静态方法或属性,不能调用非静态结构
5、非静态代码块
--内部可以有输出语句
--随着对象的创建而自动执行,每创建一个对象就会执行一次。
--作用:可以在创建对象时,对对象的属性等进行初始化。
--如果定义了多个非静态代码块,则按照声明的先后顺序执行
--非静态代码块内部可以调用静态结构和非静态结构
补充:
对属性可以赋值的位置
1、默认初始化
2、显式初始化
3、构造器中初始化
4、有了对象之后,可以通过对象.属性或者对象.方法的方式,进行赋值
5、在代码块中赋值
先后顺序为:1-2/5-3-4
实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序:
由父及子,静态先行。
//代码块的示例代码
public class BlockTest { public static void main(String[] args) { String desc = Humen.desc; Humen p1 = new Humen(); Humen p2 = new Humen(); System.out.println(p1.age+" "+p2.age); Humen.info(); System.out.println(desc); } } class Humen{ //属性 String name; int age; static String desc="我是一个人"; // 构造器 public Humen() { super(); } public Humen(String name, int age) { super(); this.name = name; this.age = age; } //静态代码块 static{ System.out.println("hello,static block-1"); //调用静态属性 desc = "static block change me"; } static{ System.out.println("hello,static block-2"); //调用静态方法 info(); // age=1;不可以调用非静态结构 } //非静态代码块 { System.out.println("hello,block"); //调非静态结构 age=1; //调静态结构 info(); } //方法 public void eat() { System.out.println("eating"); } @Override public String toString() { return "Humen [name=" + name + ", age=" + age + "]"; } public static void info() { System.out.println("i am happy human"); } }