1.单个类中代码执行循序
public class CClass{
int i = 3;
int j = 0;
{
System.out.println("C0");
}
CClass(){
System.out.println("C1");
}
void out() {
System.out.println(i+" "+j);
}
static{
System.out.println("C2");
}
{
System.out.println("C3");
}
}
public static void main(String[] args) {
FClass s = new CClass();
s.out();
System.out.println(s.i+" "+s.j);
}
结果:C2 、 C0 、C3 、C1、3 0
static静态代码块-->代码块-->构造方法-->普通方法
2.多个类继承情况下执行顺序
abstract class BaseClass {
int i;
int j;
public BaseClass() {
System.out.println("B0");
}
abstract void out();
}
class FClass extends BaseClass{
int i = 0;
int j = 3;
FClass(){
System.out.println("F0");
}
@Override
void out() {
System.out.println(i+" "+j);
}
static{
System.out.println("F1");
}
{
System.out.println("F2");
}
}
class CClass extends FClass{
int i = 3;
int j = 0;
{
System.out.println("C0");
}
CClass(){
System.out.println("C1");
}
@Override
void out() {
System.out.println(i+" "+j);
}
static{
System.out.println("C2");
}
{
System.out.println("C3");
}
}
public static void main(String[] args) {
FClass s = new CClass();
s.out();
System.out.println(s.i+" "+s.j);
}
执行顺序:
F1
C2
B0
F2
F0
C0
C3
C1
3 0
0 3
1.首先加载static静态块,先加载父类再加载子类,先FClass-->CClass。
2.下面也是按类继承顺序,先加载父类再子类,这个顺序很好理解,没有父哪有子,所以先加载终极父类,再依次向下加载,类中执行顺序和上面一样,static静态块都已经先加载了:代码块-->构造方法-->普通方法。
3.s.out()重写了父类的方法,所以会执行子类方法
4.s.i和s.j子类覆盖了改属性,但是父类仍引用旧属性