Java面向对象笔记(九)多态

一、什么是多态

多态就是指一个事物具备了多种表现形态

二、多态的体现

①父类的引用指向了自己的子类对象

②父类的引用也可以接受自己的子类对象

二、多态的前提

①必须是类与类之间有关系,要么被继承,要么被实现

②通常存在覆盖(重写)

三、多态的好处

大大的提高了程序的扩展性

例:

//定义一个Animal类描述动物的共性
class Animal {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void eat(){
		System.out.println("动物吃饭....");
	}
	protected void sound(){
		System.out.println("动物的声音....");
	}
}
//Cat类继承Animal类
class Cat extends Animal {	
	public void eat(){  //重写父类eat方法
		System.out.println("猫吃鱼");
	}
	public void sound(){
		System.out.println("喵喵喵");
	}
	public void showCat(){
		System.out.println("I am a cat");
	}
}
//Dog类继承Animal类
class Dog extends Animal {
	public void eat(){
		System.out.println("狗吃骨头");
	}
	public void sound(){
		System.out.println("汪汪汪");
	}
        public void showDog(){
		System.out.println("I am a dog");
	}
}
//动物类测试类
class AnimalTest
{
	public static void main(String[] args){
		//没有使用多态的写法
		Cat c = new Cat();
		c.eat();
		c.sound();
		Dog d = new Dog();
		d.eat();
		d.sound();
		/*
		当有了一个新的动物老鼠时,需要重新实例化一个对象,调用老鼠的方法
		使得代码变得麻烦。
		*/

		//使用多态的写法,只要是动物就可以调用function()实现功能,
		//大大的提高了程序的扩展性
		function(new Cat());
		function(new Dog());
	}
	public static void function(Animal a){
		a.eat();
		a.sound();
	}
}

四、多态的弊端

①只能使用父类的引用访问父类中的成员

Animal a = new Cat();  //类型提升,向上转型

这意味着对象a只能访问父类Animal类中存在的成员,而不能访问自己特有的成员。

②如果想要调用猫的特有方法,强制将父类的应用转成子类类型   向下转型

Cat c = (Cat)a;

//将对象a转成Cat型后就可以访问Cat特有的方法

a.showCat();

五、在多态中成员的特点

①成员函数

在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败

Animal a = new Cat();

a.eat();

编译时,a对象调用的方法只能是Animal中存在的方法,否则编译失败

在运行时期:参阅对象所属的类中是否有调用的方法。

Animal a = new Cat();

a.eat();

运行时,a调用的方法是Cat类中重写后的eat()方法

简单总结:成员函数在多态调用时,编译看左边,运行看右边

②成员变量

无论编译还是运行,都参阅引用型变量所属的类中是否存在该成员变量。

即成员变量在多态调用时,都看左边。

③静态成员

在多态中,静态成员函数和变量的调用都看左边。

六、instanceof 关键字

a  instanceof  b   //判断a是否为b的对象

例:

Animal a = new Cat();
//判断对象a是否为Cat的实例,若是强制将a转成Cat型,调用Cat特有的方法showCat().
if(a instanceof Cat){
	Cat b = (Cat)a;
	b.showCat();
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值