Java类执行顺序
例子一 其它类Main方法 调用 子类构造方法
public class Sequence1MainTest {
/**
* -------类 声明-------
* -------构造器-------
* 父类 静态代码块
* 子类 静态代码块
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------构造器2-------
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------私有方法-------
* 子类 普通方法
*/
public static void main(String[] args) {
System.out.println("-------类 声明-------");
Sequence1ChildTest test;
System.out.println("-------构造器-------");
test = new Sequence1ChildTest();
System.out.println("-------构造器2-------");
test = new Sequence1ChildTest();
System.out.println("-------私有方法-------");
test.method();
}
}
class Sequence1ChildTest extends Sequence1ParentTest {
{ System.out.println("子类 普通代码块"); }
static { System.out.println("子类 静态代码块"); }
public Sequence1ChildTest() { System.out.println("子类 构造器"); }
public void method() { System.out.println("子类 普通方法"); }
public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence1ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence1ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
例子二 子类Main方法 调用 子类构造方法
public class Sequence2ChildTest extends Sequence2ParentTest {
/**
* 父类 静态代码块
* 子类 静态代码块
* -------类 声明-------
* -------构造器-------
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------构造器2-------
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------私有方法-------
* 子类 普通方法
*/
public static void main(String[] args) {
System.out.println("-------类 声明-------");
Sequence2ParentTest test;
System.out.println("-------构造器-------");
test = new Sequence2ChildTest();
System.out.println("-------构造器2-------");
test = new Sequence2ChildTest();
System.out.println("-------私有方法-------");
test.method();
}
{ System.out.println("子类 普通代码块"); }
static { System.out.println("子类 静态代码块"); }
public Sequence2ChildTest() { System.out.println("子类 构造器"); }
public void method() { System.out.println("子类 普通方法"); }
public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence2ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence2ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
例子三 其它类Main方法 调用 子类静态方法
public class Sequence3MainTest {
/**
* -------类 声明-------
* -------静态方法-------
* 父类 静态代码块
* 子类 静态代码块
* 子类 静态方法
* -------静态方法2-------
* 子类 静态方法
*/
public static void main(String[] args) {
System.out.println("-------类 声明-------");
Sequence3ChildTest test;
System.out.println("-------静态方法-------");
Sequence3ChildTest.staticMethod();
System.out.println("-------静态方法2-------");
Sequence3ChildTest.staticMethod();
}
}
class Sequence3ChildTest extends Sequence3ParentTest {
{ System.out.println("子类 普通代码块"); }
static { System.out.println("子类 静态代码块"); }
public Sequence3ChildTest() { System.out.println("子类 构造器"); }
public void method() { System.out.println("子类 普通方法"); }
public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence3ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence3ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
例子四 子类Main方法 调用 子类 静态方法
public class Sequence4ChildTest extends Sequence4ParentTest {
/**
* 父类 静态代码块
* 子类 静态代码块
* -------类 声明-------
* -------静态方法-------
* 子类 静态方法
* -------静态方法2-------
* 子类 静态方法
*/
public static void main(String[] args) {
System.out.println("-------类 声明-------");
Sequence4ChildTest test;
System.out.println("-------静态方法-------");
Sequence4ChildTest.staticMethod();
System.out.println("-------静态方法2-------");
Sequence4ChildTest.staticMethod();
}
{ System.out.println("子类 普通代码块"); }
static { System.out.println("子类 静态代码块"); }
public Sequence4ChildTest() { System.out.println("子类 构造器"); }
public void method() { System.out.println("子类 普通方法"); }
public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence4ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence4ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
例子五 其它类Main方法 调用 子类反射实例对象
public class Sequence5MainTest {
/**
* -------类 声明-------
* -------构造器-------
* 父类 静态代码块
* 子类 静态代码块
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------构造器2-------
* 父类 普通代码块
* 父类 构造器
* 子类 普通代码块
* 子类 构造器
* -------私有方法-------
* 子类 普通方法
*/
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
System.out.println("-------类 声明-------");
Sequence5ChildTest test;
System.out.println("-------构造器-------");
test = Sequence5ChildTest.class.newInstance();
System.out.println("-------构造器2-------");
test = Sequence5ChildTest.class.newInstance();
System.out.println("-------私有方法-------");
test.method();
}
}
class Sequence5ChildTest extends Sequence5ParentTest {
{ System.out.println("子类 普通代码块"); }
static { System.out.println("子类 静态代码块"); }
public Sequence5ChildTest() { System.out.println("子类 构造器"); }
public void method() { System.out.println("子类 普通方法"); }
public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence5ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence5ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
例子六 其它类Main方法 调用 两个子类构造方法
public class Sequence6MainTest {
/**
* -------类 声明-------
* -------子类1 构造器-------
* 父类 静态代码块
* 子类1 静态代码块
* 父类 普通代码块
* 父类 构造器
* 子类1 普通代码块
* 子类1 构造器
* -------子类2 构造器-------
* 子类2 静态代码块
* 父类 普通代码块
* 父类 构造器
* 子类2 普通代码块
* 子类2 构造器
* -------私有方法-------
* 子类2 普通方法
*/
public static void main(String[] args) {
System.out.println("-------类 声明-------");
Sequence6ParentTest test;
System.out.println("-------子类1 构造器-------");
test = new Sequence6Child1Test();
System.out.println("-------子类2 构造器-------");
test = new Sequence6Child2Test();
System.out.println("-------私有方法-------");
test.method();
}
}
class Sequence6Child1Test extends Sequence6ParentTest {
{ System.out.println("子类1 普通代码块"); }
static { System.out.println("子类1 静态代码块"); }
public Sequence6Child1Test() { System.out.println("子类1 构造器"); }
public void method() { System.out.println("子类1 普通方法"); }
public static void staticMethod() { System.out.println("子类1 静态方法"); }
}
class Sequence6Child2Test extends Sequence6ParentTest {
{ System.out.println("子类2 普通代码块"); }
static { System.out.println("子类2 静态代码块"); }
public Sequence6Child2Test() { System.out.println("子类2 构造器"); }
public void method() { System.out.println("子类2 普通方法"); }
public static void staticMethod() { System.out.println("子类2 静态方法"); }
}
class Sequence6ParentTest {
{ System.out.println("父类 普通代码块"); }
static { System.out.println("父类 静态代码块"); }
public Sequence6ParentTest() { System.out.println("父类 构造器"); }
public void method() { System.out.println("父类 普通方法"); }
public static void staticMethod() { System.out.println("父类 静态方法"); }
}
结果
1、静态代码块是类对象初始化方法,类被加载时最先执行且只执行一次;
执行顺序是先父类,再子类,只执行一次;
2、普通代码块是实例对象初始化方法,每次new或反射newInstance生成实例对象时都会执行一次,可以执行多次;
执行顺序是先父类普通代码块,再父类构造方法,然后子类普通代码块,最后子类构造方法,多次实例化,多次执行;
3、调用静态方法不会执行非静态方法快。静态方法不能重写,不会涉及父类静态方法