1.【接口的定义】
(1)接口名/接口文件与类类似,接口也是使用.java文件编写。
(2)声明接口的关键字:interface,接口名命名规范与类名相同,习惯上,接口可以用I开头表示。
(3)接口的访问修饰符只能使用public和default修饰,不能使用protected和private(与外部类相同)。
(4)接口中的所有的属性,只能是公共的,静态的,常量。
public static final int NAME=1;
而且,public/static/final都可以省略,省略后依然是公共的,静态的常量。
int NAME=1;
(5)接口中所有的方法必须是公共的抽象方法。
而且,接口中的抽象方法,也可以省略public/abstract关键字。
(public abstract) void say();
2.【实现类实现接口】
(1)一个类实现接口使用implements关键字
(2)实现类实现一个接口,必须重写接口中的所有抽象方法,除非这个类是抽象类。
一个类可以使用多个接口,多个接口之间,使用逗号隔开。
class Desk implements IUsb2,3()
一个类如果实现多个接口,必须重写所有接口中的所有方法。
(3)接口的引用可指向其实现类的对象(类似于父类引用指向子类对象)
IUsb2 usb=new UDesk();
因此可以使用接口实现多态。
3.【接口继承接口】
(1)接口可以继承接口,使用extends关键字,接口继承与类的接口一样。
interface IUsb3 extends IUsb2{}
(2)接口可以多继承,多个父接口用逗号分隔,子接口继承多个父接口,将拥有所有父接口的抽象方法。
interface IUsb3 extends IUsb2,IUsb1{}
(接口不能被实例化)
4.【接口和抽象类的区别】
它们的本质区别:
抽象类是一个类,接口是一个接口,子类继承抽象类,要求子类必须和父类是同一类事物,必须符合is-a关系。
接口只是对功能的扩展。
多个实现类实现接口时,并不要求所有的实现类是一类事物。
接口符合like-a关系,理解为XXX具备一个XXX功能。比如人类狗类都具有吃饭功能,都具有吃饭接口,但是人类狗类的吃饭功能不能从同一个父类中继承。
(1)抽象类只能单继承,接口可以多继承,多实现。
(2)抽象类可以有自己的属性,接口中只能有静态常量。
(3)抽象类可以有非抽象方法,接口中的所有方法都必须是抽象方法(接口中的抽象方法可以省略abstract )。
(4)抽象类是一个类,接口是一种规范。
子类继承抽象类,要求子类必须和父类是同一类事物。
接口并不要求多个实现类是同一类事物,只能进行设计与实现的分离。
interface IUsb2 { /* public final static*/ int NAME=1; // public String name="1";//name是静态的,斜体的,接口的静态属性 /*public abstract*/public void useUsb2();//在类中没有大括号必须加abstract修饰 } interface IUsb3 extends IUsb2{ void useUsb3(); } class UDesk implements IUsb2,IUsb3{ @Override public void useUsb2() { // TODO Auto-generated method stub System.out.println("U盘使用useUsb2接口读取数据"); } public void useUsb3() { // TODO Auto-generated method stub System.out.println("U盘使用useUsb3接口读取数据"); } } class PC{ private IUsb2 usb2 ; public PC(IUsb2 usb2){ super(); this.usb2=usb2; } public void useUsb(){ usb2.useUsb2(); } } public class Usb{ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(IUsb2.NAME); IUsb2 usb=new UDesk(); PC pc=new PC(new UDesk() ); pc.useUsb(); } }