类初始化

类初始化和实例初始化顺序

实例初始化过程

类初始化和实例初始化顺序

参考代码及运行结果

类初始化和实例初始化顺序

在此过程中可能会涉及方法的重写

方法的重写Override

  1. 哪些方法不可以被重写

    ◆ final方法

    ◆ 静态方法

    ◆ private等子类中不可见的方法

  2. 对象的多态性
    ◆ 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
    ◆ 非静态方法默认的调用对象是this
    ◆ this对象在构造器或者说方法中就是正在创建的对象

代码

/*
 * 父类的初始化<clinit>
 * (1) j = mothod()
 * (2) 父类的静态代码块
 * 
 * 父类的实例初始化:
 * (1) super() (最前)
 * (2) i = test()
 * (3) 父类的非静态代码块
 * (4) 父类的无参构造器(最后)
 * 
 * 非静态方法前面其实有一个默认的对象this
 * this在构造器(或<init>)它表示的是正在创建Son对象
 * 所以test()执行的是子类重写的代码(面向对象多态)
 * 
 * 这里的i=test()执行的是子类重写的test()方法
 */
public class Father {
	private int i = test();
	private static int j = method();
	
	static {
		System.out.print("(1)");
	}
	Father(){
		System.out.print("(2)");
	}
	{
		System.out.print("(3)");
	}
	public int test(){
		System.out.print("(4)");
		return 1;
	}
	public static int method() {
		System.out.print("(5)");
		return 1;
	}
	
}



/*
 * 子类类的初始化<clinit>:
 * (1) j = mothod()
 * (2) 父类的静态代码块
 * 
 * 先初始化父类:(5)(1)
 * 初始化子类: (10)(6)
 * 
 * 子类的实例初始化:
 * (1) super() (最前)(9)(3)(2)
 * (2) i = test() (9)
 * (3) 子类的非静态代码块 (8)
 * (4) 子类的无参构造器(最后 ) (7)
 */
public class Son extends Father{
	private int i = test();
	private static int j = method();
	static {
		System.out.print("(6)");
	}
	Son(){
		System.out.print("(7)");
	}
	{
		System.out.print("(8)");
	}
	public int test(){
		System.out.print("(9)");
		return 1;
	}
	public static int method() {
		System.out.print("(10)");
		return 1;
	}
	
	public static void main(String[] args) {
		Son s1 = new Son();
		System.out.println();
		Son s2 = new Son();
	}

}




相关文章: