一、定义
使用{}定义的一段代码称为代码块,根据代码块定义的位置以及关键字,又可以分为以下四种:
1、普通代码块;
2、构造代码块;
3、静态代码块;
4、同步代码块;
二、普通代码块
定义在方法中的代码块
public class Main{
public static void main(String[] args){//直接使用{}定义,普通方法块
int x=10;
System.out.println("x1="+x);
}
}
三、构造代码块
定义在类中的代码块,也叫实例代码块,一般用于初始化实例成员变量
public class Student{
private String name;
private String gender;
private int age;
private double score;
{//实例代码块
this.name="zxy";
this.age=13;
this.gender="女";
System.out.println("i am student")
}
}
四、静态代码块
使用static定义的代码块,一般用于初始化静态成员变量
public class student{
static int age ;
int hight;
static{//静态代码块(定义在类中,方法外,当类加载的时候,就会被触发)
age=12;
}
student{//构造代码
this.hight=hight;
}
}
五、注意事项
public class Main {
public static void main(String[] args) {
person p1=new person(111);
System.out.println(p1.hinght);
p1.classs();
person p2=new person(222);
System.out.println(p2.hinght);
p2.classs();
}
}
class person{
static String name;
static int age;
int hinght;
static{
name="zxy";
age=18;
System.out.println("静态代码块执行了");
}
{
this.hinght=123;
System.out.println("实例代码块执行了");
}
person(int hinght){
this.hinght=hinght;
System.out.println("构造代码块");
}
public void classs(){
System.out.println("普通代码块执行");
}
}
由结果可知:
静态代码块不管生成多少个对象,其只会执行一次。
静态成员变量是类的属性,因此是在jvm加载类时开辟空间并初始化
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行
执行顺序:静态--普通--构造
六、有继承关系时的顺序
父类静态代码块优先于子类静态代码块,且是最早执行的;
父类实例代码块和父类构造方法紧接着执行;
子类的实例和构造也是紧接着再执行;
第二次实例化子类对象时,父类和子类的静态代码块将不会再执行;
class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person:构造方法执行");
}
{
System.out.println("Person:实例代码块执行");
}
static {
System.out.println("Person:静态代码块执行");
}
}
class Student extends Person{
public Student(String name,int age) {
super(name,age);
System.out.println("Student:构造方法执行");
}
{
System.out.println("Student:实例代码块执行");
}
static {
System.out.println("Student:静态代码块执行");
}
}
public class Main {
public static void main(String[] args) {
Student student1 = new Student("张三", 19);
System.out.println("===========================");
Student student2 = new Student("gaobo", 20);
}
}