认识代码块
1.1什么是代码块
使用 {} 定义的一段代码.
根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块(了解即可,一般不会用)
构造块(实例代码块)
静态代码块
同步代码块(后续讲解多线程部分再谈)
1.2普通代码块
普通代码块:定义在方法中的代码块.
public class Main{ public static void main(String[] args) { { //直接使用{}定义,普通方法块 int x = 10 ; System.out.println("x1 = " +x); } int x = 100 ; System.out.println("x2 = " +x); } } // 执行结果 x1 = 10 x2 = 100
这种用法较少见。
1.3构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
class Person { private String name;//实例成员变量private int age; private String sex; public Person() { System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } public void show() { System.out.println("name: " + name + " age: " + age + " sex: " + sex); } } public class Main { public static void main(String[] args) { Person p1 = new Person(); p1.show(); } } // 运行结果 I am instance init()! I am Person init()! name: bit age: 12 sex: man
注意事项: 实例代码块优先于构造函数执行。
1.4静态代码块
使用static定义的代码块。一般用于初始化静态成员属性。
代码示例:此处思考最终的输出结果是多少呢?
class Person2 { private String name;//实例成员变量 private int age; private String sex; private static int count = 0;//静态成员变量 public Person2() { System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } //静态代码块 static { count = 10;//只能访问静态数据成员 System.out.println("I am static init()!"); } public void show() { System.out.println("name: " + name + " age: " + age + " sex: " + sex); } } public class LeiHeDuiXiang6 { public static void main(String[] args) { Person2 p1 = new Person2(); Person2 p2 = new Person2(); } }
注意事项:
1.静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。 2.静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。(重点) 所以我们可以推断出上述代码最终的输出结果为: I am static init()! I am instance init()! I am Person init()! I am instance init()! I am Person init()!
此时我们来修改下代码再看两个问题:
class Person2 { private String name;//实例成员变量 private int age; private String sex; public static int count = 0;//静态成员变量 public Person2() { System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } //静态代码块 static { count = 10;//只能访问静态数据成员 System.out.println("I am static init()!"); } public void show() { System.out.println("name: " + name + " age: " + age + " sex: " + sex); } } public class LeiHeDuiXiang6 { public static void main(String[] args) { System.out.println(Person2.count); } } //执行结果 I am static init()! 10
此时若只单独执行System.out.println(Person2.count);这一行语句的时候,首先会先执行静态代码块,然后执行输出语句System.out.println(Person2.count)。
count最终的输出值为10,原因是此时首先在类中定义count为0后,在静态代码块中又对count重新赋值了一个10,
假如此时我们调换类中代码的书写顺序,即静态代码块在前,public static int count = 0这条赋值语句在后的话,则最终输出结果为0.
此时我们会发现若单独执行这一条语句,实例代码块和构造函数是不会被执行的,只会执行一次静态代码块,这是为什么?
答:原因是我们是count是静态的变量,是不依赖对象的,是可以通过类直接访问的,这期间并没有发生对象的实例化,所以对象实例代码块以及构造函数是都不会执行的