OnJava8(Java编程思想5笔记)

490 阅读2分钟

概览

书源

OnJava8 中文翻译版

内容介绍

初次写博客, 顺手摘录下书中部分精华内容, 当熟悉下Markdown语法吧.
所有内容都会标出链接,详细内容请参考原文,此处不搬运代码.

正文

第九章-多态

协变返回类型

  1. 定义

协变返回类型,这表示子类在重写方法时,可以修改返回值类型定义为基类方法中定义的返回类型的子类类型:

这个名词看起来不太熟悉, 其实这个特性的用法可能并不陌生, 它来自于jdk1.5, 属于方法重写这块的知识, 但平时可能用得不多. 这里描述一下其用处:
此处定义一个Factory, 用于创建接口Instrument的实现类, 并调用其个性方法.

interface InstrumentFactory{
    Instrument buildInstrument();
}
class WindFactory implements InstrumentFactory{
    @Override
    public Wind buildInstrument(){
        /*
        该接口方法定义的返回类型是Instrument,重写时返回的却是Wind子类,
        这样在返回时进一步缩小了类型范围,使得重写之后的方法在使用时更加清爽,  
        将调用者对原返回类型进行向下转型时采用instanceof运算符判断和强转操作转交给了编译器进行检查.
        */
        return new Wind();
    }
}
class Instrument{
    public void common(){
        System.out.println("Instrument共有方法");
    }
}
class Wind extends Instrument{
    public void individual(){
        System.out.println("Wind类个性方法");
    }
}
public class CovariantReturn {
    public static void main(String[] args) {
        WindFactory windFactory = new WindFactory();
        Wind wind = windFactory.buildInstrument();
        wind.individual();
        /*
        若不采用协变返回类型, 返回的就是Instrument类.
            Instrument instrument = windFactory.buildInstrument();
        想要调用Wind类的个性方法,正确代码如下:
            if(instrument instanceof Wind){
                ((Wind)instrument).individual();
            }
        */
    }
}

使用继承设计

1. 使用继承和组合的通用准则

使用继承表达行为的差异,使用属性表达状态的变化。

译文这句话感觉没说完整,自己稍微改动如下:

使用继承表达行为的差异,使用组合作为属性表达状态的变化。

这个准则请参考他给出的例子自行体会.

第十章-接口

2. 抽象类和接口

1. 抽象类中不允许定义 private abstract修饰的方法

private abstract 被禁止了是有意义的,因为你不可能在 AbstractAccess 的任何子类中合法地定义它。

这句话解释得有点模糊, 个人认为其中最直白的说法就是abstract方法需要非抽象子类去重写, 如果同时用private修饰可见性, 那么子类就无法重写到该方法. 它俩在一起就会前后矛盾, 所以不能通过编译.

2. 方法签名
方法签名包括方法名和参数类型,编译器用它来区分方法.但是:

返回值类型不是方法签名的一部分,因此不能用来区分方法.

这具体表现在以下方面:

  • 方法重载
  • 实现的多个接口中, 都有相同方法签名的默认方法