Java编程思想读书笔记--第九章 接口

接口和内部类为我们提供了一种将接口与现实分离的更加结构化的方法

抽象类和抽象方法

  • 抽象方法:用关键字abstract表示。如:
1
public abstract void play();
  • 抽象类:是普通类和接口之间的中庸之道。同样用关键字abstract表示。
1
2
3
4
5
6
abstract class Instrument{
public abstract void play();
public void wind(){
//this is Common method
}
}

abstract使用注意

1.包含抽象方法的类必定是抽象类,抽象类不一定包含抽象方法(无意义)
2.当子类想通过继承的方式来使用父类(假设父类有抽象方法),那么它必须实现父类的抽象方法。如果不实现,那么它也只能是抽象类。并且继承父类的全部抽象方法。
3.abstract类里允许有普通方法。

作用:

  • 它们可以使类的抽象性明确起来,并告诉用户和编译器打算怎么使用它们。
  • 抽象类还是很有用的重构工具,它们使得我们可以很容易的将公共方法沿着继承层次结构向上移动。

接口

  • interface这个关键字来产生一个完全抽象的类(没有普通方法)
1
2
3
public interface Instrument{
public void play();
}
  • 被用来建立类与类之间的协议
  • 允许创建一个能够被向上转型为多种基类的类型,来实现某种类似多种继承变种的特性
  • 要实现一个接口,需要用implements关键字。
1
2
3
4
5
6
public class InstrumentImpl implements Instrument{
@Override
public void play(){

}
}
  • 接口也可以包含域,但是这些域隐式的是static和final的。
  • 接口中的方法可以不声明访问级别(默认不写/finally),它们自动就是public的。

Java中的多重继承

  • Java是单继承模式,但是我们可以使用implements来实现多重继承(implements多个接口,用逗号相隔)
1
2
3
4
5
6
7
8
9
10
11
12
13
interface c{
void flight();
}
interface c2{
void swim();
}
class c3{
void fly(){}
}
class Hero extends c3 implements c,c2{
void flight(){}
void swim(){}
}

注意:

1.如果一个类同时需要extends和implements,需要将extends放在implements前面。
2.需要实现多个接口情况下,尽量避免不同接口的方法名相同。

使用接口的核心原因:

  • 为了能够向上转型为多个基类型(以及由此带来灵活性)
  • 防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。
  • 如果确认某个事物应该成为基类,那么首选接口。