目录
- 多态的概念
- 对象上下转型
- 多态应用之打印机
多态的概念
多态是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。比如:猫吃鱼、狗吃肉、人吃米饭。
多态存在的三个必要条件:
- 需要存在继承(extends)或实现(接口)关系
- 同样的方法调用而执行不同操作、运行不用代码(重写)
- 在运行时父类或者接口的引用变量可以引用其子类的对象
多态的作用:
- 多态通过分类做什么(eat)和怎么做(猫和狗eat不一样),从一个角度将接口和实现进行分离
- 多态消除了类型之间的耦合关系
- 多态的存在提高了程序的拓展性和后期的可维护性
例子:(直接点击运行提示缺少cat类,右击run as运行成功 why?)
//或者:abstract class Animal
class Animal
{String name;public void eat();//或者:abstract public void eat();
}class Dog extends Animal
{public void eat(){//区分重写和重载System.out.println("狗啃骨头");}}class Cat extends Animal
{public void eat(){System.out.println("猫吃鱼");}
}public class Test {public static void main(String[] args){Animal an1 = new Dog();//在运行时父类或者接口的引用变量可以引用其子类的对象Animal an2 = new Cat();//属于下面讲的向上转型 子类向父类转 an1.eat();an2.eat();}
}
对象上下转型
-
由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
-
向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
-
向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
-
与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
例子:
//或者:abstract class Animal
class Animal
{String name;public void eat();//或者:abstract public void eat();
}class Dog extends Animal
{public void eat(){//区分重写和重载System.out.println("狗啃骨头");}}class Cat extends Animal
{public void eat(){System.out.println("猫吃鱼");}public void sleep(){System.out.println("猫睡觉");}
}public class Test {public static void main(String[] args){Animal an1 = new Dog();Animal an2 = new Cat();an1.eat();//an2.sleep(); 向上转型丢失方法Cat cat1 = new Cat();//这样就不会丢失方法cat1.sleep();if(an1 instanceof Cat){ //instanceof通过返回值(布尔值)指出对象是否是特定类或是它的一个子类System.out.println("aa");}if(an2 instanceof Cat){System.out.println("bb");Cat cat2 = (Cat)an2;//类型强转,类似C语言cat2.eat();}}
}
运行结果:
狗啃骨头
猫睡觉
bb
猫吃鱼