Java中的多态

interface A{
	public void eat();
}
class Person implements A{
	public void eat(){
		System.out.println("人吃饭");
	}
	public void person(){
		System.out.println("人是属于高级动物");
	}
}
class Dog implements A{
	public void eat(){
		System.out.println("狗吃狗粮");
	}
	public void kan(){
		System.out.println("狗还会看家");
	}
}
public class DuoTai{
	public static void main(String[] args){
		//向上转型,将子类类型隐藏,或不用使用子类的特有方法。
		A a = new Dog();	//自动类型提升,但是子类特有功能无法访问
		fun(a);
		
		// Person p = (Person) a;//向下转型
		// p.person();//现在就可以访问Person类中的特有方法了
	}
	public static void fun(A a){
		a.eat();
		if(a instanceof Person){//instanceof:用于判断对象的具体类型,只能用于引用数据类型判断。
				//通常在向下转型前用于健壮性的判断。
			Person p = (Person) a;
			p.person();
		}
		else if(a instanceof Dog){
			Dog d = (Dog) a;
			d.kan();
		}
	}
}
/*
	如果要想访问子类特有功能必须使用向下转型,向下转型的目的就是为了使用子类的特有方法
	ClassCastException(类型转换异常)
	注意:对于转型,自始至终都是子类对象在做着类型的变化。
	
	多态时,
成员的特点:
1,成员变量:
	编译时:参考引用型变量所属的类中的是否有调用的成员变量,有编译通过,没有,编译失败。
	运行时,参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
	简单说,编译和运行都参考左边。
	
	
2,成员函数(非静态):
	编译时,参考引用型变量所属的类中是否有调用的函数。有,编译通过,没有,编译失败。
	运行时:参考的时对象所属的类中是否有调用的函数。
	简单说:编译看左边运行看右边。
	
3,静态函数:
	编译时:参考引用型变量所属的类中是否有调用的静态方法。
	运行时:参考引用型变量所属的类中是否有调用的静态方法。
	简单说,编译和运行都看左边。
	
	其实对于静态方法,是不需要对象的,直接用雷鸣调用即可。
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值