JAVA 类的实例化过程

Java只支持单继承,不支持多继承,但是支持同时实现多个接口
子类不能继承父类的构造函数,但是:
在子类的构造函数中,必须调用父类的构造函数,且必须放在子类构造函数的第一行;【this和super不能同时使用】
省略时,默认调用无参构造。

Java的类中包括:静态代码块、非静态代码块(也叫构造代码块)、静态成员变量、非静态成员变量、构造函数、成员函数(不区分静态/非静态)
1)没有继承父类的情况下,实例化对象时的执行顺序是:
静态代码块/静态成员>非静态代码块/非静态成员变量>构造函数>成员函数
其中:同一级别的部分按出现位置从前往后执行
2)继承父类的情况下,子类实例化对象时的执行顺序时:
父类的静态代码块/静态成员>子类的静态代码块/静态成员>父类的非静态代码块/非静态成员变量>父类的构造函数>子类的非静态代码块/非静态成员变量>子类的构造函数
其中:同一级别的部分按出现位置从前往后执行

示例:

class m_0019_s extends m_0019_f{
	static{
		System.out.println("子类静态代码块2");
	}
	static{
		System.out.println("子类静态代码块1");
	}
	
	{
		System.out.println("子类非静态代码块1");
	}
	
	public m_0019_s(){
		System.out.println("子类构造方法1");
	}

	{
		System.out.println("子类非静态代码块2");
	}
}

class m_0019_f {
	static{
		System.out.println("父类静态代码块2");
	}
	static{
		System.out.println("父类静态代码块1");
	}
	
	{
		System.out.println("父类非静态代码块1");
	}
	
	int i;
	static int j=2;
	
	public m_0019_f(){
		System.out.println("父类构造方法");
	}

	{
		System.out.println("父类非静态代码块2");
	}
}

public class m_0019{
	public static void main(String [] args) {
		m_0019_s m = new m_0019_s();
	}
}

运行结果:

父类静态代码块2
父类静态代码块1
子类静态代码块2
子类静态代码块1
父类非静态代码块1
父类非静态代码块2
父类构造方法
子类非静态代码块1
子类非静态代码块2
子类构造方法1

扩展:子类实例化过程进阶

/**
 * 函数执行顺序测试
 */
public class m_0015 {
    public static void main(String [] args){
        System.out.println(new B().getValue());
    }
}

class A{
    protected int value;
    public A(int v) {
        setValue(v);
    }
    public void setValue(int value){
        this.value = value;//this指本类
    }
    public int getValue(){
        try{
            value++;
            return value;
        } catch(Exception e){
            System.out.println(e.toString());
        } finally {
            this.setValue(value);//this指当前对象
            System.out.println(value);
        }
        return value;
    }
}

class B extends A{
    public B() {
        super(5);
        setValue(getValue() - 3);
    }
    public void setValue(int value){
        super.setValue(2 * value);
    }
}
/**
 * 子类继承父类,调用方法时先是调用子类中的方法,如果没有就调用父类中的方法
 * try{ }、catch{ }、finally{ }返回值的问题,一旦try{ }中返回了某一个值,如果finally有返回值,finally中的返回值会覆盖try的返回值,如果finally没有返回值,就是try中的返回值。
 */

运行结果:

22
34
17

猜你喜欢

转载自my.oschina.net/MasterLi161307040026/blog/1796429