public class Person {
protected static String Name = "张三";
public static String getName() {
return Name;
}
static {
System.out.print("Person 静态代码快\n");
}
{
System.out.print("Person 非静态代码块1 \n");
}
public Person(){
System.out.print("Person 构造方法\n");
}
{
System.out.print("Person 非静态代码块2 \n");
}
}
public class Student extends Person {
// public static String Name = "李四";
public static String newName = "李四";
public static String getName(){
return newName;
}
{
System.out.print("student 非静态代码块2 \n");
}
public Student(){
System.out.print("student 构造方法\n");
}
static {
System.out.print("Sudent 静态代码快\n");
}
{
System.out.print("student 非静态代码块1 \n");
}
}
public class PersonTest {
public static void main(String[] args) {
System.out.print(Student.Name+"<=======Name========\n");
System.out.print(Student.getName()+"<====getName====\n");
Student student = new Student();
Student student1 = new Student();
}
}
执行结果如下:
Person 静态代码快
张三<=======Name========
Sudent 静态代码快
李四<====getName====
Person 非静态代码块1
Person 非静态代码块2
Person 构造方法
student 非静态代码块2
student 非静态代码块1
student 构造方法
Person 非静态代码块1
Person 非静态代码块2
Person 构造方法
student 非静态代码块2
student 非静态代码块1
student 构造方法
总结:
- 子类继承父类,当实例化子类时,首先类加载器会先加载父类,其次加载子类,静态代码块在类加载后执行,即如上先执行Person 静态代码块,后执行student 静态代码块。
- 非静态代码块会在构造方法之前执行,并且按照在类中出现的顺序执行。
- 静态变量,静态方法,可以被子类继承,并且可以被子类覆盖。