多态性
“对于面向对象的程序设计语言,多态性是第三种最基本的特征(前两种是数据抽象和继承。” “多态性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与 “怎样做”两个模块的分离。利用多形性的概念,代码的组织以及可读性均能获得改善。此外,还能创建 “易于扩展”的程序。无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成 长”。 通过合并各种特征与行为,封装技术可创建出新的数据类型。通过对具体实施细节的隐藏,可将接口与实施 细节分离,使所有细节成为“private”(私有)。这种组织方式使那些有程序化编程背景人感觉颇为舒适。 但多态性却涉及对“类型”的分解。通过上一章的学习,大家已知道通过继承可将一个对象当作它自己的类型或者它自己的基础类型对待。这种能力是十分重要的,==因为多个类型(从相同的基础类型中衍生出来)可被当作同一种类型对待。==而且只需一段代码,即可对所有不同的类型进行同样的处理。利用具有多形性的方法调用,一种类型可将自己与另一种相似的类型区分开,只要它们都是从相同的基础类型中衍生出来的。这 种区分是通过各种方法在行为上的差异实现的,可通过基础类实现对那些方法的调用。 在这一章中,大家要由浅入深地学习有关多形性的问题(也叫作动态绑定、推迟绑定或者运行期绑定)。同时举一些简单的例子,其中所有无关的部分都已剥除,只保留与多形性有关的代码。
向上转型
父类定义
public class Fruit {
public void eat() {
System.out.println("吃水果");
}
}
子类(苹果)定义
public class Apple extends Fruit{
@Override
public void eat() {
System.out.println("吃苹果");
}
public void planting() {
System.out.println("种苹果");
}
}
子类(香蕉)定义
public class Banana extends Fruit{
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
测试类
public class Test {
public static void testEat(Fruit fruit) {
fruit.eat();
}
public static void main(String[] args) {
testEat(new Apple());
testEat(new Banana());
}
}
详解:
1.向上转型的实现
public class Test {
public static void main(String[] args) {
Fruit apple = new Apple(); // 向上转型
apple.eat(); // 调用子类的eat()方法
apple.planting(); // 报错!向上转型的同时也失去了子类的方法planting()
}
}
2.为何不直接Apple apple = new Apple()
呢?
没有体现出面向对象的抽象的编程思想呀,降低了代码的可扩展性.
3.向上转型的好处?
如上代码就是用的向上转型,若是不用向上转型,那么有多少个子类就得在这儿写多少种不同的吃的方法
向下转型
public class Test {
public static void main(String[] args) {
Fruit fruit = new Fruit();
Apple apple = (Apple)fruit; // 向下转型
apple.eat();
apple.planting(); // 因为向下转型是不安全的所以报错了
}
}
- Java为了解决不安全的向下转型问题,引入泛型的概念
- 为了安全的类型转换,最好先用 if(A instanceof B) 判断一下