首先,明确一个概念。
派生类和基类等价于父类和子类。基类即是父类,派生类就是子类的意思。
进如正题,根据我查阅资料和实践的总结,规律如下:
父类先于子类 静态的先于非静态的 变量代码同级别,执行顺序看定义顺序。
执行顺序如下:(没有箭头,中间用空格隔开的表示这两个级别相同,执行顺序主要根据定义顺序)
父类的静态变量 父类的静态代码块 --》子类的静态变量 子类的静态代码块 --》 父类的非静态变量 父类的非静态代码块 --》父类的构造函数 --》 子类的非静态变量 子类的非静态代码块 --》子类的构造函数
示例代码如下:(代码的顺序故意写的比较乱,为了看清定义顺序的影响)
package com.btmianhua.exam;
class Parent {
// 静态变量
public static String p_StaticField = "父类--静态变量";
// 构造器
public Parent() {
System.out.println("父类--构造器");
}
// 变量
public String p_Field = "父类--变量";
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 静态变量2
public static String p_StaticField2 = "父类--静态变量2";
// 初始化块
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
// 变量2
public String p_Field2 = "父类--变量2";
}
public class SubClass extends Parent {
// 静态变量
public static String s_StaticField = "子类--静态变量";
// 变量
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
// 初始化块
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
// 构造器
public SubClass() {
System.out.println("子类--构造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
打印结果如下:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
但是,用断点调试的时候可以发现,变量和代码在同一级别。举个例子,父类的变量执行顺序如下:变量--》代码块--》变量2.。