java特性-多态

1:多态的定义
一个对象变量(例如:变量e)可以引用多种实际类型的现象被称为多态(polymorphism)。在运行时能够自动的选择调用哪个方法的现象被称为动态绑定(dynamic binding)。

2:多态只适用于方法,不适用于域。

//父类
class Father {

	public int field = 0;
	
	public int getField() {
		return field;
	}
}

//子类
class Son extends Father {

	public int field = 1;
	
	public int getField() {
		return field;
	}
	
	public int getSuperField() {
		return super.field;
	}
}

//测试类
public class TestOverride {

	public static void main(String[] args) {
		Father fa = new Son();//父类应用指向子类对象
		Son son = new Son();
		System.out.println("super.field="+fa.field+", super.getField()="+fa.getField());
		System.out.println("son.field="+son.field+", son.getField()="+son.getField()+", son.getSuperField()"+son.getSuperField());
	}
}

//测试结果
super.field=0, super.getField()=1
son.field=1, son.getField()=1, son.getSuperField()0


3:多态即是父类或者接口类型的引用指向子类或实现接口类型的对象;

4:从对象的内存角度来理解试试.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
Father f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
Son s1 = s;//s1指向那1.5M的内存.
Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

你可能感兴趣的:(java,F#)