这是看到的一道笔试题目,当时在思考为什么会出现这个,于是找到了一个子类继承父类后new子类对象的代码
父类
public class JVMBase {
public static String staticName="父类静态变量";
public String name="父类非静态变量";
static{
System.out.println(staticName);
System.out.println("父类静态代码块");
}
public static void baseStaticMethod(){
//方法只有被调用才会被执行
System.out.println("父类静态方法");
}
{
System.out.println(name);
System.out.println("父类匿名代码块");
}
public JVMBase(){
System.out.println("父类无参构造函数");
}
}
子类
public class JVMSub extends JVMBase{
public static String subStaticName="子类静态变量";
public String subName="子类非静态变量";
static{
System.out.println(subStaticName);
System.out.println("子类静态代码块");
}
public static void subStaticMethod(){
System.out.println("子类静态方法");
}
{
System.out.println(subName);
System.out.println("子类匿名代码块");
}
public JVMSub(){
//super(); 默认执行父类的无参构造
System.out.println("子类无参构造函数");
}
public static void main(String[] args) {
JVMSub sub=new JVMSub();
}
}
运行结果:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量
父类匿名代码块
父类无参构造函数
子类非静态变量
子类匿名代码块
子类无参构造函数
就是先创建父类 – 再子类,记住肯定是先把父类创建好,再创建子类,这是一个大顺序,
至于单个类中的执行顺序就需要大家花点脑子记一下,先静态-- 后非静态,ok,有了这个概念就不会搞错执行顺序了。
总结:
父类静态 -- 子类静态(静态代码块只执行一次)
父类非静态 -- 父类构造 (子类无参构造写不写super() ,默认都走父类无参构造。子类构造写super(有参) ,走父类的有参构造)
子类非静态 -- 子类构造 (创建子类对象时无参走无参构造,有参走有参构造)
下面这个讲的更详细点https://www.cnblogs.com/mindOpen/p/13020119.html