概览
书源
OnJava8 中文翻译版
内容介绍
初次写博客, 顺手摘录下书中部分精华内容, 当熟悉下Markdown语法吧.
所有内容都会标出链接,详细内容请参考原文,此处不搬运代码.
正文
第九章-多态
协变返回类型
- 定义
协变返回类型,这表示子类在重写方法时,可以修改返回值类型定义为基类方法中定义的返回类型的子类类型:
这个名词看起来不太熟悉, 其实这个特性的用法可能并不陌生, 它来自于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. 方法签名
方法签名包括方法名和参数类型,编译器用它来区分方法.但是:
返回值类型不是方法签名的一部分,因此不能用来区分方法.
这具体表现在以下方面:
- 方法重载
- 实现的多个接口中, 都有相同方法签名的默认方法