接口(接口的作用非常的丰富,往往和设计模式结合在一起的):
- 概念:可以认为接口是一种“彻底”的抽象类,接口是从多个相似的类中抽取出来的一种规范,接口的体现是规范(通信规范),如主板上各种不同类型的“插槽”,无论哪个厂商,无论哪个型号的主板,它们都可以与CPU、显卡、内存进行数据通信——因为国际上有一套公开的“标准”(规范),就是通过接口体现出来。
- 定义的语法:
【修饰符】 interface 接口名
{
//0 ~ N个Field定义
//0 ~ N个抽象方法
//0 ~ N个内部类、内部接口、内部枚举定义
}
注意:
- 接口不能有构造器、初始化块;
- 修饰符可以为:public或省略;不能使用static修饰、不能用final(不允许有子类)修饰、不用abstract;
- 接口名:多个单词连缀而成,每个单词的首字母大写,推荐接口用“形容词”,在有些地方(c#),推荐接口以I开头,后来有些Java程序员也用这种方式,【接口里的成分,都是public,因为接口体现的时公开的标准】;
- 接口里的Field,默认有3个修饰符:public、static、final,无论写还是不写,反正都有【接口里的Field,声明时必须指定初始值,因为final修饰的类变量只能在声明时,静态初始化中指定初始值,又由于接口不包含初始化块,所以只能在声明时指定初始值】;
- 接口里的方法,默认有2个修饰符:public、abstract,无论写还是不写,反正都有【接口里的方法不可能是static,因为接口里的方法默认有abstract修饰】;
- 接口里的内部类、内部接口、内部枚举,默认有2个修饰符,public、static,无论写还是不写,反正都有;
- abstract和static不能同时修饰方法、abstract与private不能让同时修饰方法、abstract与final不能同时出现,二者永远互斥;
- 一个接口可以有N个直接父接口。有了接口之后,接口可以用于定义变量,接口不可以创建实例,接口最大的用途就是供其他类实现自己;
- implements实现一个或者N个接口,当一个类实现接口之后,实现类要么为抽象父类的所有抽象方法提供实现,否则你的子类也只能是抽象类;
- 接口主要在“面向接口编程”时候,提供更灵活的机制
interface A
{
}
interface B
{
}
interface C
{
}
//一个接口,可以拥有N个直接的父接口
public interface D extends A,B,C
{
}
interface Eatable
{
void eat();
}
interface Flyable
{
void fly();
}
public interface Walkable extends Eatable
{
int AGE = 20;
//对于执行“宏替换”,变量名应该是多个单词连缀而成,并且所有字母全部大写,单词与单词之间以下划线隔开
final String MY_NAME = "张三";
//接口里的成分只能用public修饰,可省略
double weight = 34.4;
//方法前面默认有public abstract修饰。
void info();
//方法前面默认有abstract修饰,所以方法后面坚决不能有花括号
// void test(){} //错误
}
//一个类可以同时“实现”N个接口
public class Sparrow implements Flyable, Walkable
{
@Override
public void eat()
{
System.out.println("麻雀一口一口地吃麦子");
}
public void fly()
{
System.out.println("麻雀在天空飞翔");
}
public void info()
{
System.out.println("我是一只小麻雀");
}
public static void main(String[] args)
{
//向上转型
Walkable w = new Sparrow();
//w引用变量,在编译时只是Walkable类型
//因此,编译器只能允许调用Walkable里的方法
w.eat(); //麻雀一口一口地吃麦子
w.info(); //我是一只小麻雀
//强转,向下转型
Sparrow sp = (Sparrow) w;
sp.eat(); //麻雀一口一口地吃麦子
sp.fly(); //麻雀在天空飞翔
sp.info(); //我是一只小麻雀
Sparrow fy = new Sparrow();
fy.fly(); //麻雀在天空飞翔
}
}
- 说明:
- 接口与抽象类之间的相似之处:都可以包含抽象方法;都不能创建实例;子类继承抽象类,实现接口,都要求实现所有的抽象方法,否则子类也只能是抽象类
- 接口与抽象类之间的区别之处:接口里只能有抽象方法,但抽象类可以没有抽象方法,只包含普通方法;接口里不能定义静态方法,但抽象类可以包含静态方法;接口里的Field总是有public、static、final,但抽象类中的Field完全可以是最普通的Field;接口不能包含构造器,但抽象类完全可以有构造器;接口不能包含初始化块,但抽象类完全可以有初始化块;接口可以有多个直接的父接口,但抽象类只能有一个直接父类。