一、代码块:
语法:使用{}包裹的,可以在{}中写代码。
修饰符:static 或者不修饰。
static修饰的为静态代码代码块。
格式:
//静态代码块,随着类的加载児执行static{System.out.println("这是静态代码块");}
不修饰的为非静态代码块:
//非静态代码块,随着类的加载,随着对象的创建而执行{System.out.println("我是一个非静态代码块");}
静态代码块和非静态代码块的加载和执行有区别,其中静态代码块在类的加载的时候就执行了,非静态代码块在对象的创建时才会执行,每创建一个对象就会执行一次。
举个例子:
package com.netease;
/*
* 代码块和内部类
* 作用:用来初始化类和对象,所以也叫做初始化块
* 修饰符:static或者不修饰
* 静态代码块和非静态代码块:
*
* */
public class Main {public static void main(String[] args) {// write your code hereString desc = Person.desc;Person p1 = new Person();Person p2 = new Person();}
}class Person{String name;int age;static String desc = "我是一个人";//构造器public Person(){}public Person(String name, int age){this.name = name;this.age = age;}//静态代码块,随着类的加载児执行static{System.out.println("这是静态代码块");}//非静态代码块,随着类的加载,随着对象的创建而执行{System.out.println("我是一个非静态代码块");}//方法public void eat(){System.out.println("吃饭");}@Overridepublic String toString(){return "Person [name=" + name + ",age=" + age + "]";}
}
执行结果:
这是静态代码块
我是一个非静态代码块
我是一个非静态代码块
在main方法中第一句是创建一个变量并且初始化的值是类的静态变量,此时就会加载类,加载类就会去执行一次静态代码块。
第二句和第三句均是创建一个对象,可以看到输出了两次非静态代码块的内容。说明没创建一个对象就会执行一次非静态代码块。
再想想,如果再创建一个变量,并赋值为类变量,会不会再去执行一次静态代码块?
执行结果:
这是静态代码块
我是一个非静态代码块
我是一个非静态代码块
可以看到不会,说明静态代码块只会执行一次。而非静态代码块会在每次创建一个对象时执行一次。
那么按照修饰符把代码块分为了静态代码块和非静态代码块,从上面的实验也能够看出他们的作用是不一样的。那么他们都有什么作用呢?使用场景是什么?
二、代码块的作用
静态代码块:初始化类的信息
非静态代码块:可以在创建对象时,初始化对象的信息,即对对象的属性等进行初始化。
三、补充
代码块在一个类中可以定义多个代码块,执行顺序按照声明的顺序进行执行。
静态代码块的执行要早于非静态代码块。因为静态代码块是随着类的加载而执行。
静态代码块中只能调用静态属性和方法,不能调用非静态的。
非静态的可以调用静态属性和方法,非静态属性和方法。
通常情况下,只定义一个。。。。