(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)不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章