接口(interface)
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法) 都有!
- 接口:只有规范!
为什么需要接口?
- 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
- 抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。
从接口的实现者角度看,接口定义了可以向外部提供的服务。
从接口的调用者角度看,接口定义了实现者能提供那些服务
如何定义接口?
**格式:**
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义//接口中的属性只能是常量,总是:public static final 修饰。不写也是。
方法定义//接口中的方法只能是:public abstract。 省略的话,也是public abstract.
/*
访问修饰符:只能是public或默认。
接口名:和类名采用相同命名机制
extends:接口可以多继承
*/
}
接口的本质探讨
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。
接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
OOP的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计 模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
接口使用要点
- 子类通过implements来实现接口中的规范
- 接口不能创建实例,但是可用于声明引用变量类型。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
- 接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。
- 常量必然是:public static final。 我们不加这些修饰符,也是这样。
- 方法必然是:public abstrac。 我们不加这些修饰符,也是这样。
- 接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。
public interface MyInteface {
//接口中只有常量和抽象方法
/*public static final*/ String MAX_GREAD = "BOSS";
int MAX_SPEED = 120;
/*public abstract*/ void test01();
public int test02(int a,int b);
}
public interface Flyable {
int MAX_SPEED = 11000;
int MIN_HEIGHT = 1;
void fly();
}
interface Attack {
void attack();
}
class Plane implements Flyable{
@Override
public void fly() {
System.out.println("飞机靠发动机飞!");
}
}
class Man implements Flyable{
@Override
public void fly() {
System.out.println("跳起来,飞!");
}
}
class Stone implements Flyable, Attack{
int weight;
@Override
public void fly() {
System.out.println("被人扔出去,飞!");
}
@Override
public void attack() {
System.out.println("石头攻击!");
}
}
public class Test {
public static void main(String[] args) {
Flyable f = new Stone();
f.fly();
}
}
public interface InterfaceA {
void aaa();
}
interface InterfaceB {
void bbb();
}
interface InterfaceC extends InterfaceA,InterfaceB {
void ccc();
}
class TestClass implements InterfaceC{
@Override
public void aaa() {
// TODO Auto-generated method stub
}
@Override
public void bbb() {
// TODO Auto-generated method stub
}
@Override
public void ccc() {
// TODO Auto-generated method stub
}
}