一、接口的概念:
接口是功能的集合,其是一个比抽象类还抽象的类,也可以把它看作是一种数据类型。
接口只是描述其具备的方法,但是并未具体实现,具体的实现是由接口的实现类去完成。
二、接口的定义:
接口的定义需要使用interface关键字,通过编译器编译以后生成.class文件,可看作为是一种包含了功能的特殊类。
定义格式:
1 public interface 接口名 {2 抽象方法1;3 抽象方法2;4 抽象方法3;5 }
• 接口中的方法均为公共访问的抽象方法
• 接口中无法定义普通的成员变量
三、类实现接口:
类与接口的关系为实现关系,既类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。
实现类实现接口后,就相当于声明:“我应该具备该接口的功能”。实现类中必须要重写接口中的抽象方法来实现具体的功能。
定义格式:
class 类 implements 接口 { 重写接口中方法}
在该类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类必须要重写抽象方法,完成具体的逻辑。
此处可以理解为,类是实现事物的描述,接口是事物功能的集合体。
四、接口中成员的特点:
接口中定义变量的固定格式:public static final,所以接口中的变量也可称作为常量,其值不能改变。
接口中定义方法的固定格式:public abstract class 方法名(){}
接口不可以创建对象。
子类必须要全部重写接口中的抽象方法,否则子类还是一个抽象的类。
public interface Demo { //定义一个名称为Demo的接口。 public static final int NUM = 3;// NUM的值不能改变 public abstract void show1(); public abstract void show2();} //定义子类去覆盖接口中的方法。类与接口之间的关系是 实现。通过 关键字 implementspublic class DemoImpl implements Demo { //子类实现Demo接口。 //重写接口中的方法。 public void show1(){} public void show2(){}}
五、接口的多实现:
为什么要定义接口,使用抽象类描述也没有问题,接口到底有啥用呢?
接口最重要的体现:解决多继承的弊端。将多继承这种机制在java中通过多实现完成了。
1 interface Fu1 2 { 3 void show1(); 4 } 5 interface Fu2 6 { 7 void show2(); 8 } 9 class Zi implements Fu1,Fu2// 多实现。同时实现多个接口。10 {11 public void show1(){}12 public void show2(){}13 }
怎么解决多继承的弊端呢?
弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。
其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。
为什么多实现能解决了呢?
因为接口中的功能都没有方法体,由子类来明确。
六、类继承类的同时实现接口:
子类在扩展其功能的场景下如何去实现呢?
子类可以通过继承父类和实现接口来解决上述的场景。
通过子类通过继承父类扩展功能,通过继承扩展的功能都是子类具备的基础功能,通过实现接口扩展其它类中的功能。
1 class Fu { 2 public void show(){} 3 } 4 interface Inter { 5 pulbic abstract void show1(); 6 } 7 class Zi extends Fu implements Inter { 8 public void show1() { 9 }10 }
接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能。
七、接口的多继承:
类与类之间可以通过继承产生关系,类与接口直接可以通过实现来产生关系,接口与接口之间通过什么来产生关系呢?
接口与接口之间可以通过extends 继承来产生关系,然后通过类来实现子接口内的所有抽象方法(包括父接口中)。
1 public interface A { 2 public abstract void a(); 3 } 4 5 public interface B { 6 public abstract void b(); 7 } 8 9 public interface C {10 public abstract void c();11 }12 13 /*14 * 接口与接口之间,是继承关系15 * Java支持接口之间的多继承,一个接口可以同时继承多个接口16 * */17 public interface D extends A,B,C {18 public abstract void d();19 }20 21 /*22 * 实现接口D,重写D的全部抽象方法23 * 而且接口D,继承A、B、C24 * Test实现类,重写A、B、C、D三接口全部抽象方法25 * */26 public class Test implements D {27 public void a() {}28 public void b() {}29 public void c() {}30 public void d() {}31 }
八、接口的思想:
例子:
电脑上留有很多个插口,而这些插口可以插入相应的设备,这些设备为什么能插在上面呢?主要原因是这些设备在生产的时候符合了这个插口的使用规则,否则将无法插入接口中,更无法使用。发现这个插口的出现让我们使用更多的设备。
优处:
接口可以扩展功能
接口可以暴漏出来规则
接口可以降低耦合性,既,设备与设备之间实现了解耦问题
九、接口和抽象类的区别:
接口和抽象类的却别是什么?
例子:
犬:
行为:
吼叫;
吃饭;
缉毒犬:
行为:
吼叫;
吃饭;
缉毒;
分析:
由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将这个行为写为抽象行为,那么这个类也就是抽象类。
可是当缉毒犬有其他额外功能时,而这个功能并不在这个事物的体系中。这时可以让缉毒犬具备犬科自身特点的同时也有其他额外功能,可以将这个额外功能定义接口中。
代码:
1 interface 缉毒{ 2 public abstract void 缉毒(); 3 } 4 //定义犬科的这个提醒的共性功能 5 abstract class 犬科{ 6 public abstract void 吃饭(); 7 public abstract void 吼叫(); 8 } 9 // 缉毒犬属于犬科一种,让其继承犬科,获取的犬科的特性,10 //由于缉毒犬具有缉毒功能,那么它只要实现缉毒接口即可,这样即保证缉毒犬具备犬科的特性,也拥有了缉毒的功能11 class 缉毒犬 extends 犬科 implements 缉毒{12 13 public void 缉毒() {14 }15 void 吃饭() {16 }17 void 吼叫() {18 }19 }20 class 缉毒猪 implements 缉毒{21 public void 缉毒() {22 }23 }
通过上述,归纳接口和抽象类的相同和不同
相同点:
1、都是继承的顶端,用于被其它类实现和继承
2、都不能直接实例化
3、都包含抽象方法,子类必须重写这些抽象方法
区别:
1、抽象类中既包括抽象方法也可以包括非抽象方法,避免子类重复实现这些方法,提高代码重用性,接口只能包含抽象方法
2、一个类只能继承一个父类,但是可以实现多个接口,实现接口避免了单继承的问题
3、抽象类是事物中应该具备的内容,继承体系是is...a关系
4、接口是事物中的额外内容,继承体系是like...a关系
两者选用:
1、优先选择接口,尽量少用抽象类
2、需要定义子类的行为,又要为子类提供共性功能时候才使用抽象类