(9)2017.8.9-面向对象(4)

每天且笔记的时间都到了第二天,现在继续回顾面向对象的知识点,前几篇文章里已经写了有关封装和继承的知识,这篇文章我们就着重看看java面向对象的最后一个特性:多态。

首先我们从多态的概念说起,多态可以理解为一个事物的多种表现形态,它在java中有两个体现:

第一就是方法的重载(overlode)和重写(overwrite)

第二就是对象的多态性(抽象类,接口,转型)

方法的重写和重载在之前已经说过了,那么什么是对象的多态性呢,其实从字面含义来理解对象的多态性就是一种对象的多种形态,在java中,子类可以替代父类的对象使用。

那么多态性就会有使用前提了,一共有两点,分别是:

(1)要继承,实现(接口)

(2)要有子类对父类方法的重写,使子类具有不同的方法实现

我们在这里就会用到一个很神奇的东西:转型,它分为上转型和下转型。

其中上转型是将父类的引用类型指向子类的对象,我们以一个例子来描述上转型:

首先,我们创建父类Animal,并在其中我创建了两个子类为Dog类和Cat类,在其中重写了eat()的方法,这样我们就满足了多态的两个前置条件:

package cn.hpe.www;

public class Animal {
	public void eat() {
		System.out.println("emmmmm....");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("吃鱼");
	}

	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("吃骨头");
	}

	public void watchDoor() {
		System.out.println("看家");
	}
}
最后我们创建TestAnimal类来演示上转型的效果:

package cn.hpe.www;

public class TestAnimal {
	
	public static void main(String[] args) {
		Animal cat = new Cat();
		Animal dog = new Dog();
		Animal animal = new Animal();
function(cat);function(dog);// dog.eat();function(animal);}public static void function(Animal a){a.eat();}}


记住,上转型就是将父类类型的引用指向子类,所以我们在这个main方法中直接使用了上转型,我们执行的方法其实实质性的子类重写的方法,这时我们输出的结果是:


注意一点那就是子类对象的多态性,并不适用于属性,也不是用于静态方法。

那么有童鞋会问了,向下转型又是什么呢,向下转型就是父引用的对象转换为子类类型

我们还是举个例子,假设我在刚才的子类Dog类里添加一个父类没有的方法watchDoor(),在Cat里面我也加一个CatchMouse

那么我在调用的时候不能直接通父类调用抓老鼠和看门方法,因为父类中没有这两个方法,此时我们就需要进行下转型:

package cn.hpe.www;

public class TestAnimal {
	static Animal cat = new Cat();
	static Animal dog = new Dog();
	static Animal animal = new Animal();
	public static void main(String[] args) {
		
		function(cat);

		function(dog);
//		dog.eat();
		function(animal);
	}
	public static void function(Animal a){
		a.eat();
		if(a instanceof Cat){
			Cat c = (Cat) cat;
			c.catchMouse();
		}
		if(a instanceof Dog){
			Dog d = (Dog) dog;
			d.watchDoor();
		}
		
	}
}

向下转型时,要使用强转符:()

这里用到了一个叫instanceof的东西,它是用来判断前后类是否一致,如果一致返回true不一致返回false

运行结果:


这样我们就可以在父类中调用子类中的对象了。

说了这么多,那多态有啥好处啊,它的主要好处有:

(1)可以增强程序的可扩展性及可维护性,使代码更加简洁。 

(2)不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小五丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值