多态的概念
多态是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。比如:猫吃鱼、狗吃肉、人吃米饭。
多态存在的三个必要条件:
- 需要存在继承(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
猫吃鱼