Java多态

在面相对象的程序设计语音中,多态是继数据抽象和继承之后的第三种基本特征。

多态的作用是消除类型之间的耦合关系(在修改|扩展继承类的时候不必修改有引用该类的其他类)

例:

Class Shape{
    public void draw(){...}
    public void erase(){...}
}

Class Circle extends Shape{
    public void draw(){System.out.println("Circle");}
    public void erase(){...}
}

Class Square extends Shape{
    public void draw(){System.out.println("Square");}
    public void erase(){...}
}

Class Test{
    public void draw(Shape s){
        s.draw();
        s.erase();
    }
}
其中 CircleSquare都是继承了 Shape类,并重写了draw和erase两个方法,当 Test类的draw要调用时需要引入参数 Shape s,此时s可以向上转型为 CircleSquare,当有其他的类继承 Shape类后也可以作为 Test类中draw的参数,方便我们扩展与修改。

多态的前提:

  • 存在继承关系
  • 子类重写父类方法
  • 父类对象数据类型的引用指向子类对象---如Test类中draw参数的引用

多态也称为动态绑定后期绑定或运行时绑定,其含义是在运行过程中根据对象的类型进行绑定。不同的编译器有不同的机制处理后期绑定。Java中除了static和final方法之外,其他所有方法都是后期绑定。

缺陷:如果父类中的方法为private类型,该方法将无法被覆盖,因为private方法被自动的认为是final方法,而且对导出类是屏蔽的。

引入多态后构造器调用顺序:

  1. 在其他任何事物发生之前,将分配给对象的储存空间初始化为二进制的零
  2. 调用基类构造器,并反复递归
  3. 按声明顺序调用成员的初始化方法
  4. 调用导出类构造器主体

注意:建立类首先选择“组合”,尤其是在不能十分确定该使用“组合”还是继承时。组合不会强制我们的程序设计进入继承的层次结构中。

协变返回类型

概念

导出类(子类)覆盖(即重写)基类(父类)方法时,返回的类型可以是基类方法返回类型的子类

看概念有点难以理解,举个例子:
Class A{}
Class B extends A{}
Class C{
    public A process(){}
}
Class D extends C{
    public B process(){}
}

B是A的子类,D是C的子类,C类中的函数process()的返回类型是A,当我们的D类继承C类重写process()函数的时候我们的返回类型可以是A的子类B(或者其他子类)。

纯继承与扩展

纯继承(“is-a”关系):子类中的接口(方法)都能在父类中找到,即没有扩展接口(方法)。

扩展(“is-like-a”关系):子类中有扩展接口。

比较:

  • 纯继承的导出类可以完全代替基类,而在使用它们时,完全不需要知道关于子类的任何额外信息。
  • 扩展的导出类拥有额外的接口,更加灵活,但一旦我们向上转型,就不能使用扩展的新方法。

以上总结自《Java编程思想(Thinking in Java)》——YayayaHong
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值