代码块:
也叫初始化块,是用来做初始化的。
作用:
初始化类或者初始化当前对象
注意:
代码块如果有修饰只能使用static进行修饰
分类:
根据是否用static进行修饰分成静态代码块和非静态代码块
静态代码块:用static进行修饰的代码块
特点:
1)静态代码块会随着类的加载而加载,并且执行。且只会执行一次,只要类没有重新加载就不会行
2)如果在一个类中定义了多个静态代码块就按照声明的先后顺序执行
3)内部可以有输出语句
4)静态代码块中可以调静态的属性和方法,但不能调用非静态的属性和方法
作用:初始化类的一些信息:比如类的一些属性
注意:
静态属性和静态方法会随着类的加载而加载,但静态方法没有执行(要通过类名.),但静态代码块会随着类的加载而加载,并且执行
非静态代码块
特点:
1)非静态的结构是随着对象的创建而加载,非静态代码块是随着对象的创建而执行
2)如果在一个类中定义了多个非静态代码块就按照声明的先后顺序执行
3)内部可以有输出语句
4)非静态代码块中可以调用静态的属性和方法,也可以调用非静态的属性的和方法
作用:可以利用非静态代码块对创建的对象的属性进行初始化
注意:
1)静态代码块,非静态代码块在一个类中可以定义多个
2)静态代码块比非静态代码块先执行,因为是随着类的加载而执行
3)我们一般不会去写多个非静态代码块或者静态代码块,要执行一起执行即可
4)每造一次对象,非静态代码块都执行一次,静态代码块只会在类加载时被执行
5)实际开发中用代码块并不多,因为可以使用其他的初始化方式
package test;
public class Test {
//当在main中只有String desc=Person.desc;时,console的信息为hello,static block
//当在main中只有Person p=new Person();时,console的信息为hello, block
public static void main(String[] args) {
String desc=Person.desc;//使类加载到内存当中,因为当我们去使用类时,类就会加载
System.out.println(desc);//我是一个爱学习的人
Person p=new Person();
Person p1=new Person();//每造一次对象,非静态代码块都执行一次,
System.out.println(p1.age);//1
}
}
class Person{
String name;
int age;
static String desc="我是一个人";//关于人的描述
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
public void eat() {
System.out.println("吃饭");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//静态代码块
static{
System.out.println("hello,static block");
desc="我是一个爱学习的人";
//ihfo();静态代码块中可以调静态的属性和方法
}
//非静态代码块
{
System.out.println("hello,block");
//age=1;调用非静态的属性的和方法
//desc="我是一个爱学习的人";调用静态的属性的和方法
//ihfo();调用静态的属性的和方法
}
public static void ihfo() {
System.out.println("快乐");
}
}