JAVASE----多态

先不多说,直接上代码

Teacher.java

 

package jz.file.polymorphism;

public class Teacher {
	public void getHomework(){
		System.out.println("Teacher.getHomework()~~");
	}
}

 CnTeacher.java

 

package jz.file.polymorphism;

public class CnTeacher extends Teacher{
	/**
	 * 重写一下父类的方法
	 */
	@Override
	public void getHomework() {
		System.out.println("CnTeacher.getHomework()~~");
	}
	/**
	 * 创建一个自己的方法
	 */
	public void readChinese(){
		System.out.println("hello chinese");
	}
}
接下来我们开始

package jz.file.polymorphism;

public class Polymorphism {
	public static void main(String args[]) {
		Teacher t1 = new Teacher();
		t1.getHomework();
		Teacher t2 = new CnTeacher();
		t2.getHomework();
		// /**1.*/t2.readChinese();
		// /**2.*/((CnTeacher)t2).readChinese();
		CnTeacher t3 = new CnTeacher();
		t3.getHomework();
		t3.readChinese();
		// /**3.*/((Teacher)t3).getHomework();
		// /**4.*/((Teacher)t3).readChinese();
	}
}

结果
Teacher.getHomework()~~
CnTeacher.getHomework()~~
hello chinese
hello chinese

打开/**1.*/的注释,结果会报错,
因为此时的t2对象的类型是Teacher,而对于Teacher类型来说,没有readChinese()这个方法.


打开/**2.*/的注释,结果显示为CnTeacher.getHomework()~~
这里有一个动态绑定的问题.
首先说getHomework()这个方法,在"new CnTeacher()"的时候,首先调用父类的构造方法"new Teacher()",这样,在代码段中就分配了两个getHomework()的方法的空间.而在堆空间中,分别有Teacher和CnTeacher两个实例.
这样的话,问题就来了.那我在调用getHomework()这个方法的时候,系统是根据什么判断我们调用哪个方法呢?
这里就要涉及到那个动态绑定思密达.
所谓的动态绑定,就是指在程序运行的时候,动态地绑定方法.
好比我们刚才举的那个例子,在程序运行过程中,创建了CnTeacher和Teacher的对象,那么在绑定方法的时候,就是根据创建的对象来调用方法.
换句人话说,就是,new的谁,就用谁的方法.

打开/**3.*/的注释,结果和2是一样的,同样是向上转型的情况

打开/**4.*/的注释,结果报错.
想上转型后,新规的方法将不会被看到.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值