直接贴测试代码,一目了然:
package com.suning.test;
class Person {
String name;
int age;
{
System.out.println("父类的非静态代码块");
}
static {
System.out.println("父类的静态代码块");
}
Person() {
System.out.println("父类的无参构造函数");
}
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("父类的有参数构造函数");
}
void eat() {
System.out.println("父类吃饭");
}
}
class Student extends Person {
int grade;
{
System.out.println("子类的非静态代码块");
}
static {
System.out.println("子类的静态代码块");
}
Student() {
// super();//运行子类的要先运行父类无参构造函数,此处省略默认执行父类无参构造函数
System.out.println("子类的无参构造函数");
}
Student(String name, int age, int grade) {
// super(name,age);//运行子类的有参构造函数要先运行父类的有参构造函数,若父类无有参的,则运行父类无参的构造函数
this.grade = grade;
System.out.println("子类的有参数构造函数:" + name + ":" + age + ":" + grade);
}
void eat() {
System.out.println("子类吃饭");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("子类主方法");
Student s1 = new Student();
Student s2 = new Student();
s1.eat();
s2.eat();
}
}
运行结果:
子类主方法
父类的静态代码块
子类的静态代码块
父类的非静态代码块
父类的无参构造函数
子类的非静态代码块
子类的无参构造函数
父类的非静态代码块
父类的无参构造函数
子类的非静态代码块
子类的有参数构造函数:张三:19:10001
子类吃饭
子类吃饭
总体来说:一个类里,静态代码块》非静态代码块》无参构造函数(或有参构造函数)
父子类,子类静态代码块在父类静态代码块后执行;
有的童鞋会问为毛 Student s2 = new Student()不执行父类的静态代码块,o my god,初始化静态代码块就执行一次好吗?就是你启web工程时候实例化执行一次,之后再new就不执行了,你们可以打断点试下;