面向对象 多态

多态

   面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。

   概念

        -是指同一操作作用于某一类对象,产生不同的执行结果

    体现

        -父类或接口的引用变量可以引用其子类的对象

    前提

        -需要继承或实现

    实现多态的技术称为

        -动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

 作用

   -通过分离做什么和怎么做,将接口和实现进行分离

   -消除了类型之间的耦合关系

   -提高了程序的扩展性和后期的可维护性

    多态的好处

        -可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

        -可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

        -接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如CircleSphere为了实现多态,完善或者覆盖这两个接口方法。

        -灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

        -简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    对象上下转型

      -由子类型转成父类,称为向上转型

       -向上转型是一个较专业类型向较通用类型转换,所以总是安全的

       -对于向上转型,调用的变量是父类的变量,调用的方法是子类的方法

eg:

      -与之相反的是向下转型,不安全(可能需要instanceof操作符协助)

        -instanceof运算符用来指出对象是否是特定类或者是它的子类的一个实例,返回值是布尔值

        -用法:   boolean result = object instanceof class;

                       如果object是class或其子类的一个实例,返回true,如果不是或object为null,返回false

        -多态的概念基于对象引用的动态绑定特性

     多态应用

eg:

*打印机的实例,同一个实现接口,实现彩色打印机和黑白打印机的输出

public class PrinterDemo {
/**
* 多态应用 
* 同一个实现接口,实现多态
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String content = "Hello,java!";
School school = new School();

BlackPrinter bp = new BlackPrinter("惠普");
school.setPrinter(bp);
school.print(content);

ColorPrinter cp = new ColorPrinter("戴尔");
school.setPrinter(cp);
school.print(content);

}
}
class School {
//多态 :同一个实现接口,接收不同的对象,调用相同的方法,执行不同的结果
//越抽象的东西越稳定
private Printer p = null;
public void setPrinter(Printer p){
this.p = p;//向下转型
}
public void print(String content){
p.print(content);
}
}
class Printer {
private String brand;//品牌
public Printer(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void print(String content) {

        }
}
class BlackPrinter extends Printer {
public BlackPrinter(String brand) {
super(brand);
}
//重写父类的方法
@Override
public void print(String content) {
System.out.println(getBrand() + "黑白打印机,打印:" + content);
}
}
class ColorPrinter extends Printer {
public ColorPrinter(String brand) {
super(brand);
}
//重写父类的方法
@Override
public void print(String content) {
// TODO Auto-generated method stub
System.out.println(getBrand()+"彩色打印机,打印:"+content);
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值