JavaSE基础学习之面向对象-多态

第四章 面向对象-多态

  • 定义:
    某一类事物的多种存在形态。
    猫 x = new 猫( );
    动物 x = new 猫( ); //一个对象,两种形态。
    猫这类事物即具备着猫的形态,有具备着动物的形态,这就是对象的多态性。
    多态在代码中的体现:
    父类或者接口的引用指向其子类对象。
  • 实现:
abstract Animal{
	abstract eat();
}
class Dog extends Animal{
	void eat(){
		System.out.print("啃骨头");
	}
	void lookHome(){
		System.out,print("看家");
	}
}
class Cat extends Animal{
	void eat(){
		System.out.print("吃鱼");
	}
	void catchMouse(){
		System.out,print("抓老鼠");
	}
}
class Demo{
	public static void main(String[] args){
		Cat c=new Cat();
		//c.eat();
		Dog d=new Dog();
		//d.eat();
		method(c);
		method(d);
	}
	/*public static void method(Cat a){
		a.eat();
	}
	public static void method(Dog a){
		a.eat();
	}
	如果有很多个对象就需要创建很多个方法,而且方法的功能都一样。*/
	//Animal a = new Cat() = new Dog()
	public static void method(Animal a){
		a.eat();
	}
}
	
  • 多态的好处:
    提高了代码的扩展性。
  • 多态的弊端:
    前期定义的内容不能使用后期子类的特有内容。
  • 多态的前提:
    1.必须有关系,继承、实现。
    2.必须覆盖。
  • 类型转换:
abstract Animal{
	abstract eat();
}
class Dog extends Animal{
	void eat(){
		System.out.print("啃骨头");
	}
	void lookHome(){
		System.out,print("看家");
	}
}
class Cat extends Animal{
	void eat(){
		System.out.print("吃鱼");
	}
	void catchMouse(){
		System.out,print("抓老鼠");
	}
}
class Demo{
	public static void main(String[] args){
		//自动类型提升,猫对象提升成动物类型。但是特有功能无法访问。
		Animal a=new Cat();
		a.eat();
		//还想使用对象的特有功能,可以对该对象向下转型。
		Cat c=(Cat)a;
		c.catchMouse();
	}
  • 类型判断(instancesof):
abstract Animal{
	abstract eat();
}
class Dog extends Animal{
	void eat(){
		System.out.print("啃骨头");
	}
	void lookHome(){
		System.out,print("看家");
	}
}
class Cat extends Animal{
	void eat(){
		System.out.print("吃鱼");
	}
	void catchMouse(){
		System.out,print("抓老鼠");
	}
}
class Demo{
	public static void main(String[] args){
		Cat c=new Cat();
		method(new Dog());
	}
	public static void method(Animal a){
		a.eat();
		//instanceof 用于判断对象具体类型,只能用于引用类型判断
		if(a instanceof Cat){
			Cat c=(Cat)a;
			a.catchMouse();
		}else if(a instanceof Dog){
			Dog d=(Dog)a;
			d.lookHome();
		}
	}
  • 多态的特点:
    成员函数:
    1.编译时:要查看引用变量所属的类中是否有所调用成员函数, 有,编译通过,没有,编译失败。。
    2.运行时:要查看对象所属的类中是否有所调用成员函数,有,编译通过,没有,编译失败。。
    编译看左边,运行看右边。
    成员变量:
    参考引用变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败。编译和运行都参考等号左边。
  • 静态函数:
    编译和运行都看左边,因为静态方法用对象没有意义,可以直接用类名调用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值