多态的概念和案例实现
多态的概念
多态是指同一个操作作用于某一类对象可以有不同的解释,产生不同的执行结果。
多态存在的三个必要条件
- 需要存在继承和实现的关系
- 同样的方法调用而执行不同操作、运行不同代码(重写)
- 再运行时父亲或者接口的引用变量可以引用其子类的对象
多态的作用
- 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
- 多态消除了类型之间的耦合关系
- 多态的存在提高了程序的拓展性和后期的可维护性
案例实现
abstract class Animal
{
public String name;
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操作符协助)
instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例
用法:
result = object instanceof class
result: 布尔类型
object: 必选项,任意对象表达式
class: 必须阿娘,任意已定义的对象类
说明:如果object是class或其子类的一个实例,则instanceof运算符返回true,如果不是或者object是null,则返回false。
典型的使用场合
在对对象做向下转型之前,没有其他有关对象信息时,务必使用instanceof来判断一下,以免抛出ClassCastException异常。
关于向上转型的代码测试
以上代码实现的是向上转型,我们基于上面案例实现的代码进行了稍微修改,在Dog类中增加了sleep()方法,这个方法是Dog类特有的,与父类没有关系,所以在发生向上转型的时候,造成了方法的丢失,因而产生了报错。
关于向下转型的代码测试
在这里我们使用了向下转型,并且在转型之前进行了对对象是否是其子类的一个实例。这样就规避了运行报错和异常的风险。
多态应用案例之打印机
class School
{
public Print print;
public void install(Print print){ //传进来的参数是多态的
this.print = print;
}
public void print(String context){
print.print(context);
}
}
class Print
{
public String brand;
public void print(String context){
}
}
class colorPrint extends Print
{
public void print(String context){
System.out.println("彩色打印机打印"+context);
}
}
class BlackWhitePrint extends Print
{
public void print(String context){
System.out.println("黑白打印机打印"+context);
}
}
public class Printer {
public static void main(String[] args) {
School s = new School();
colorPrint c = new colorPrint();
s.install(c); //在这里发生向上转型
s.print("yangchenyang");
BlackWhitePrint b = new BlackWhitePrint();
s.install(b); //在这里发生向上转型
s.print("yangchenyang");
}
}