一、代码块:
语法:使用{}包裹的,可以在{}中写代码。
修饰符: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 here
String 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("吃饭");
}
@Override
public String toString(){
return "Person [name=" + name + ",age=" + age + "]";
}
}
执行结果:
这是静态代码块
我是一个非静态代码块
我是一个非静态代码块
在main方法中第一句是创建一个变量并且初始化的值是类的静态变量,此时就会加载类,加载类就会去执行一次静态代码块。
第二句和第三句均是创建一个对象,可以看到输出了两次非静态代码块的内容。说明没创建一个对象就会执行一次非静态代码块。
再想想,如果再创建一个变量,并赋值为类变量,会不会再去执行一次静态代码块?
执行结果:
这是静态代码块
我是一个非静态代码块
我是一个非静态代码块
可以看到不会,说明静态代码块只会执行一次。而非静态代码块会在每次创建一个对象时执行一次。
那么按照修饰符把代码块分为了静态代码块和非静态代码块,从上面的实验也能够看出他们的作用是不一样的。那么他们都有什么作用呢?使用场景是什么?
二、代码块的作用
静态代码块:初始化类的信息
非静态代码块:可以在创建对象时,初始化对象的信息,即对对象的属性等进行初始化。
三、补充
代码块在一个类中可以定义多个代码块,执行顺序按照声明的顺序进行执行。
静态代码块的执行要早于非静态代码块。因为静态代码块是随着类的加载而执行。
静态代码块中只能调用静态属性和方法,不能调用非静态的。
非静态的可以调用静态属性和方法,非静态属性和方法。
通常情况下,只定义一个。。。。