目录
六、实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序
一、代码块的作用
代码块用来初始化类、对象的信息
二、代码块的分类
代码块只能使用static关键字修饰。因此代码块分为静态代码块和非静态代码块
三、静态代码块
语法格式:
static {
//代码
}
说明:
- 内部可以输出语句
- 随着类的加载而执行,而且只执行一次
- 作用:初始化类的信息
- 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
- 静态代码块的执行要优先于非静态代码块的执行
- 静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
四、非静态代码块
语法格式:
{
//代码
}
说明:
- 内部可以输出语句
- 随着对象的创建而执行
- 每创建一个对象,就执行一次非静态代码块
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
- 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
五、静态代码块与非静态代码块举例
public class CodeBlockTest {
public static void main(String[] args) {
Person p1=new Person();
System.out.println("total="+p1.total);
System.out.println("name="+p1.name);
System.out.println("gender="+p1.gender);
System.out.println("*****************");
Person p2=new Person();
System.out.println("total="+p2.total);
System.out.println("name="+p2.name);
System.out.println("gender="+p2.gender);
}
}
class Person {
public static int total;
public String name;
public String gender;
public Person() {
}
static {
total = 100;//为total赋初值
System.out.println("静态代码块初始化类属性total");
}
{
total=200;
name="Tom";
gender="男";
System.out.println("非静态代码块初始化类属性total、属性name、属性gender");
}
}
六、实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序
由父及子,静态先行。
public class CodeBlockTest {
public static void main(String[] args) {
Student s=new Student("张三","男",1001);
System.out.println("total="+Student.total);
System.out.println("name="+s.name);
System.out.println("gender="+s.gender);
System.out.println("id="+s.id);
}
}
class Person {
public static int total;
public String name;
public String gender;
public Person(String name,String gender) {
System.out.println("Person类构造器初始化类属性total、属性name、属性gender");
total=300;
this.name=name;
this.gender=gender;
}
static {
System.out.println("Person类静态代码块初始化类属性total");
total = 100;//为total赋初值
}
{
System.out.println("Person类非静态代码块初始化类属性total、属性name、属性gender");
total=200;
name="Tom";
gender="男";
}
}
class Student extends Person{
public int id;
public Student(String name, String gender) {
super(name, gender);
// TODO Auto-generated constructor stub
}
public Student(String name, String gender, int id) {
super(name, gender);
this.id = id;
System.out.println("Student类构造器初始化类属性total、属性name、属性gender、属性id");
}
{
System.out.println("Student类非静态代码块初始化类属性total、属性name、属性gender");
total=500;
name="June";
gender="女";
}
static {
System.out.println("Student类静态代码块初始化类属性total");
total = 400;//为total赋初值
}
}