代码块
代码块: 代码块在类中声明,类似一个没有名称的方法体,分为实例代码块(非静态),静态代码块
实例代码块:在每次创建对象时自动调用
什么时候发生创建对象: new的时候
静态代码块:在类第一次被加载时自动执行,仅一次,与是否创建对象无关
类什么时候加载:
public class Demo {
int a;
static int b;
{
System.out.println("实例代码块1"+a);
}
{
System.out.println("实例代码块2"+b);//非静态的方法可以调用静态成员变量
}
static{
System.out.println("静态代码块2"+b);
}
static{
System.out.println("静态代码块1");
//这两个是按从上到下的顺序执行的
}
}
public class TestDemo {
public static void main(String[] args) {//类只加载一次,静态代码块只执行一次
System.out.println(Demo.b);//0
new Demo();//每一次创建对象的时候,实例代码块自动执行一次
new Demo();//每一次创建对象的时候,实例代码块自动执行一次
}
}
类的加载执行
触发类的加载
-
使用类: 类名.静态变量,方法
-
创建对象
类中元素加载顺序:
-
先加载静态的,(静态的变量,代码块,方法)按照从上向下的顺序执行
-
成员变量
-
实例代码块
-
构造方法
-
成员方法
public class Person {
String name;//大家都不一样 非静态 属于对象
static String head = "头";//大家都一样 static修饰
public Person(){
System.out.println("无参构造方法");
}
{
System.out.println("实例代码块");
}
static {
System.out.println("静态代码块");
}
public void eat(){ //成员方法
System.out.println(name+"吃饭"+head);
}
public static void show(){ //静态的成员方法
System.out.println(head);
}
}
public class TestPerson {
public static void main(String[] args) {
System.out.println(Person.head);//触发Person类的加载
//静态代码块
//头
new Person();
}
}