#面向对象运行顺序
定义一个父类Person
package oopES;
public class Person {
private int i =1;
//静态块
static {
System.out.println("我是父类的静态初始化块");
}
//初始化块
{
System.out.println("我是父类的初始化块");
}
//构造方法
public Person() {
System.out.println("我是父类的构造方法");
}
}
子类Student继承父类Person
package oopES;
public class Student extends Person{
static {
System.out.println("我是子类的静态初始化块");
}
{
System.out.println("我是子类的初始化块");
}
public Student() {
System.out.println("我是子类的构造方法");
}
public static void main(String[] args) {
new Student();
new Student();
}
}
运行Student 的main方法,结果为:
由运行结果可知:
面向的对象的运行顺序为:
1.先运行父类的静态初始化块
2.再运行子类的静态初始化块
3.然后运行父类的初始化块和构造方法
4.运行子类的初始化块和构造方法
注意:这里我new了两次Student对象 但是,在同一个类中静态初始化块只运行了一次, 初始化块运行了两次。
接下来又有一个问题:
属性又在什么时候被加载
又在什么时候被赋值:
1.静态属性在类加载时定义
在执行父类静态代码块之后,子类静态代码块之前被
赋值。
2.普通成员变量在创建对象或子类对象时定义,在初始化块运行之前被赋值。
3.无论是静态属性还是非静态属性,都是在定义时先给定一个默认值(默认值看属性类型而定0,null),后赋值。