1、多态

1.1、概念

多态性是指同一个操作用于某一对象,可以有不同的解释,产生不同的执行结果

1.2、多态存在的三个必要条件

(1)需要存在继承和实现关系

(2)同样的方法调用而执行不同操作、运行不同代码(重写)

(3)在运行时父类或者接口的引用变量可以引用其子类的对象

1.3、多态的作用

(1)多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离

(2)多态消除了类型间的耦合关系

(3)多态的存在提高了程序的拓展性和后期的可维护性

2、多态的上下转型

(1)由子类转型成父类,在继承图上是向上移动的,一般称为向上转型

(2)向上转型是从一个较专用类型向同用类型转换,所以总是安全的,即子类是父类的超集

(3)向上转型过程中,类接口唯一可能发生的事情是丢失方法,而不是获取方法

(4)向下转型是不安全的,需要instanceof关键字协助判断,以免抛出ClassCastException异常

a、instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例

用法:

result = object instanceof class

result:布尔类型

object:必选项,任意对象表达式

class:必选项,任意已定义的对象类

说明:如果object是class或其子类的一个实例,则instanceof运算符返回true,如果不是或者object是null,则返回false。

b、典型使用场合

在对对象做下转型之前,没有其它有关对象信息时务必使用instanceof来判断一下,以免抛出ClassCastException异常

代码示例:

abstract class Animal
{
	public String name;
	abstract void eat();
}
class Dog extends Animal
{
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗啃骨头");
	}
	public void sleep(){
		System.out.println("狗睡觉觉");
	};
}
class Cat extends Animal
{
	public void eat() {
		// TODO Auto-generated constructor stub
		System.out.println("猫吃鱼");
	}
}
public class Test {
	public static void main(String[] args) {
		Animal an1 = new Dog(); //多态的向上转型(dog->animal)
		Animal an2 = new Cat(); //多态的向上转型(dog->animal)
		an1.eat();
		//向上转型是一个较专用类型向通用类型转换,所以总是安全的,即子类是父类的超集
		//an1.sleep(); //向上转型过程中,类接口唯一可能发生的事情是丢失方法,而不是获取方法
		//好比an1在向上转型过程中丢失了sleep()方法
		Dog dog = new Dog();
		dog.sleep();
		an2.eat();
		
		//Cat cat = (Cat)an1; 这样向下转型语法没有错,但编译会报错:ClassCastException
		//cat.eat();
		//向下转型是不安全的,需要instanceof关键字协助判断,以免抛出ClassCastException异常
		if (an2 instanceof Cat){ //instanceof是的话返回true,不是的话返回false
			System.out.println("向下转型");
			Cat cat = (Cat)an2;
			cat.eat();
		}

	}
}

运行结果:

狗啃骨头
狗睡觉觉
猫吃鱼
向下转型
猫吃鱼

3、多态简单应用之打印机

代码示例:

class School
{
	Print printer;
	public void installPrinter(Print printer){
		this.printer = printer;
	}
	public void print(String contex){
		printer.print(contex);
	}
	
}
class Print
{
	String brand;
	
	public void print(String contex){
		System.out.println("打印机打印:"+contex);
	}
}

class CaiSePrint extends Print
{
	public void print(String contex){
		System.out.println("彩色打印机打印:"+contex);
	}
}
class HeiBaiPrint extends Print
{
	public void print(String contex){
		System.out.println("黑白打印机打印:"+contex);
	}
}
class D3Print extends Print
{
	public void print(String contex) {
		// TODO Auto-generated constructor stub
		System.out.println("3D打印机打印:"+contex);
	}
}
public class Printer {
	public static void main(String[] args) {
		School s = new School();
		CaiSePrint c = new CaiSePrint();
		s.installPrinter(c);
		s.print("彩色");
		
		HeiBaiPrint h = new HeiBaiPrint();
		s.installPrinter(h);
		s.print("黑白");
		
		D3Print d3 = new D3Print();
		s.installPrinter(d3);
		s.print("3D");
		
	}
}

运行结果:

彩色打印机打印:彩色
黑白打印机打印:黑白
3D打印机打印:3D