博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础_面向对象之接口
阅读量:4931 次
发布时间:2019-06-11

本文共 3909 字,大约阅读时间需要 13 分钟。

一、接口的概念:

  接口是功能的集合,其是一个比抽象类还抽象的类,也可以把它看作是一种数据类型。

  接口只是描述其具备的方法,但是并未具体实现,具体的实现是由接口的实现类去完成。

二、接口的定义:

  接口的定义需要使用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 }
View Code

八、接口的思想:

  例子:

    电脑上留有很多个插口,而这些插口可以插入相应的设备,这些设备为什么能插在上面呢?主要原因是这些设备在生产的时候符合了这个插口的使用规则,否则将无法插入接口中,更无法使用。发现这个插口的出现让我们使用更多的设备。

  优处:

    接口可以扩展功能

    接口可以暴漏出来规则

    接口可以降低耦合性,既,设备与设备之间实现了解耦问题

九、接口和抽象类的区别:

  接口和抽象类的却别是什么?

  例子:

    犬:

      行为:

        吼叫;

        吃饭;

    缉毒犬:

      行为:

        吼叫;

        吃饭;

        缉毒;

  分析:

    由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将这个行为写为抽象行为,那么这个类也就是抽象类。

    可是当缉毒犬有其他额外功能时,而这个功能并不在这个事物的体系中。这时可以让缉毒犬具备犬科自身特点的同时也有其他额外功能,可以将这个额外功能定义接口中。

  代码:

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 }
View Code

 

  通过上述,归纳接口和抽象类的相同和不同

    相同点:

      1、都是继承的顶端,用于被其它类实现和继承

      2、都不能直接实例化

      3、都包含抽象方法,子类必须重写这些抽象方法

    区别:

      1、抽象类中既包括抽象方法也可以包括非抽象方法,避免子类重复实现这些方法,提高代码重用性,接口只能包含抽象方法

      2、一个类只能继承一个父类,但是可以实现多个接口,实现接口避免了单继承的问题

      3、抽象类是事物中应该具备的内容,继承体系是is...a关系

      4、接口是事物中的额外内容,继承体系是like...a关系

    两者选用:

      1、优先选择接口,尽量少用抽象类

      2、需要定义子类的行为,又要为子类提供共性功能时候才使用抽象类

      

  

  

转载于:https://www.cnblogs.com/chanper/p/7452239.html

你可能感兴趣的文章
java9系列(九)Make G1 the Default Garbage Collector
查看>>
QAQ高精度模板笔记√
查看>>
Jmeter计数器的使用-转载
查看>>
【Android笔记】入门篇02:全屏设置和禁止横屏竖屏切换
查看>>
Kubernetes的本质
查看>>
PL/SQL developer 管理多套数据库
查看>>
黑马程序员-分类(category)
查看>>
vue-cli多页面
查看>>
进程和线程
查看>>
iOS Foundation框架简介 -1.常用结构体的用法和输出
查看>>
libevent reference Mannual I
查看>>
eclipse创建Maven父子结构Maven项目
查看>>
Python 太糟糕了?开发者总结了 8 大原因
查看>>
Spring中注入基本类型
查看>>
脚本方式安装 IIS7
查看>>
Oracle password expire notices
查看>>
发现“郝茵晴”:屌丝们的社会性传播实验
查看>>
WordPress优化:为网站添加个性化缩略图标
查看>>
shell脚本分析IP归属地
查看>>
CITRIX XenAPP/TS打印管理ThinPrint.
查看>>