Java之继承类的实例化

#初识Java继承关系类的实例化

//Test.java
public class Test{
	public static void main{
		new Subclass();
	}
	//在某个方法中构造了一个子类对象
}
class Subclass{
	static{
		System.out.println("子类的static成员");
	}
	public Subclass() {
		print();
		System.out.println("子类的构造方法");
	}
	public void print(){
		System.out.println("子类的print方法");
	}
class Superclass {
	static{
		System.out.println("子类的static成员");
	}
	public Superclass(){
		print();
		System.out.println("父类的构造方法");
	}
	public void print(){
		System.out.println("父类的print方法");
	}
}

###输出:

父类的static成员
子类的static成员
子类的print方法
父类的构造方法
子类的print方法 
子类的构造方法

  • 输出1,2句说明:
    static成员在加载字节码文件到内存过程是会被优先执行,静态成员变量会在静态数据区优先初始化

  • 输出4,6句说明:
    当用关键字new构造了一个子类实例时,会先调用父类构造方法,再调用子类构造方法

  • 输出3句说明:
    有人会怀疑:在父类构造函数中调用print方法应该是调用父类的print方法,怎么调用了子类的print方法?
    Superclass subclass = new Subclass(); //父类对象变量引用子类实例
    这就是构造方法中引用动态绑定方法,就是调用方法是取决于new关键字new出来的实例,而与前面的对象引用变量是哪个类无关,这也是多态的一种表现

    知识迁移

    1. Java源程序执行过程:后缀.java源文件先被javac.exe编译器编译成一个个后缀为.class文件,然后由java.exe解释器将.class字节码文件加载到内存中解释执行
    2. Superclass subclass = new Subclass();中new关键字的作用:
      a. 为类实例化的对象中非静态成员变量在内存的堆区申请空间
      (静态的成员在加载到内存中已经在静态数据区申请空间)
      b.在内存栈区声明一个对象引用变量,并将刚在堆区申请空间的地址赋给该对象引用变量
    3. 在子类构造方法中第一句默认是调用super();方法(不管子类构造方法是否显示调用super();方法)即调用父类构造方法,这种情况下父类没有显示声明定义的构造方法或者父类必须含有不带形参的构造方法,否者会出错
    4. 几种实例化类的方法:
实例方法 引用变量 引用目标 通过引用变量可以访问的方法
Superclass x = new Superclass(); 父类对象引用变量 父类实例 只能访问父类中非私有成员方法
Superclass x = new Subclass(); 父类对象引用变量 子类实例 可以访问父类中未被子类重写的非私有成员方法,但不可以访问子类中扩展的非私有成员方法,其中访问父类和子类中同名的非私有成员方法因为多态原因只会调用子类方法,不会调用父类中相应方法
Subclass x = new Subclass(); 子类对象引用变量 子类实例 可以访问父类中未被子类重写的非私有成员方法,也可以访问子类中扩展的非私有成员方法,其中访问父类和子类中同名的非私有成员方法因为多态原因只会调用子类方法,不会调用父类中相应方法
Subclass x = new Superclass(); 子类对象引用变量 父类实例 语法错误

你可能感兴趣的:(java)