接口

需求:需要飞到北京出差

飞机、鸟、超人不能归于一个类属,但是具有相同的特性:会飞的。所以引入一个新概念叫做接口,可以用于规范实现接口的类中必须接口中的抽象方法。接口可以理解为一种契约

使用关键字interface定义接口

public interface 会飞的 {
        public void 起飞();
        public void 巡航飞行();
        public void 降落();
}

接口不能直接使用,必须有相对应的实现类

public class 飞机类 implements 会飞的 { //共性是通过实现接口来表示的
        private String name; //名称,这是类属的属性,这里可以定义字节类的成员,和接口无关
        //如果当前类不是抽象类,则必须实现接口中的所有抽象方法
        @Override
        public void 起飞() {
                System.out.println("使劲的跑,一抬头就飞起来了");
        }
        @Override
        public void 巡航飞行() {
                System.out.println("使劲的烧油...");
        }
        @Override
        public void 降落() {
                System.out.println("我对准...");
        }
}

通过接口定义变量,使用具体类的实例,进行调用

会飞的 obj = new 飞机类();
obj.起飞();
obj.巡航飞行();
obj.降落();

引入接口的目的在于隔离实现

public void 出差(飞机 obj){}
这种写法当前类和飞机是耦合的,如果需要坐超人出差,则必须修改源代码
public void 出差(会飞的 obj){}
当前类只是和接口耦合,任何实现了接口的对象都可以作为参数进行传入

使用接口而不是使用具体的类,则可以实现在实现接口的多个具体实现类之间进行更换,例如定义出超人类

什么是接口

在Java中不支持多继承,因为会出现调用的不确定性,所以java将多继承机制进行改良,在java中变成了多实现。一个类可以实现多个接口,一个接口可以继承多个接口

package com.yan2;public class Test2 {public static void main(String[] args) {A2 aa = new A2();aa.pp();}}interface IA2 {public default void pp() {System.out.println("IA2...pp");}
}interface IB2 {public default void pp() {System.out.println("IB2...pp");}
}interface IC2 extends IA2, IB2 {@Overridedefault void pp() {IA2.super.pp();}
}class A2 implements IA2, IB2 {@Overridepublic void pp() {IA2.super.pp();System.out.println("A2...pp");IB2.super.pp();}
}

接口是一种特殊的抽象类,接口只能被abstract或者public修饰

没有构造器方法

没有属性,只能定义常量

可以包含抽象方法,也可以没有抽象方法

接口中的方法只能被public、default、abstract、static修饰

  • 一般情况下接口中之定义抽象方法
  • 定义的方法默认为公开的抽象方法

抽象方法必须在实现类中提供实现

可以使用default关键字给抽象方法提供默认实现,有默认实现的方法在实现类中的重新定义,也可以不重新定义

接口允许多重继承

一个类在继承另一个类的同时,还可以实现多个接口

允许一个类实现多个接口,但是每个接口的抽象方法都必须提供实现,否则是抽象类。提供的实现也可以是是继承

接口的出现避免了单继承的局限性,这样定义C接口则拥有A+B的所有定义,可以使用A和B接口以及父类D声明变量类型,直接new T。但是约束时,用谁声明变量编译器系统识别就是谁这种类型,也就意味只能调用识别类型中的方法,不能调用其他方法
package com.yan4;public class Test5 {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println("(1)" + a1.show(b));System.out.println("(2)" + a2.show(d));System.out.println("(3)" + b.show(c));System.out.println("(4)" + b.show(d));}
}class A {public String show(C obj) {return ("A and C");}public String show(A obj) {return "A and A";}
}class B extends A {public String show(B obj) {return "B and B";}public String show(A obj) {return "B and A";}
}class C extends B {
}class D extends B {
}

声明接口的语法

访问修饰符   interface   接口名{   }   一般建议接口名称使用形容词

如果定义public接口,则规则和定义public类一致,要求接口名称和文件名称一致
外部的接口只能使用public、默认这两个范围限定词;如果定义内部接口则可以使用4大范围限定词
接口实际上提供了同一的操作界面(方法),如果是JDK1.8-版本则一个方法也不实现,等待某类或某几个类去实现它的方法【接口中的所有方法必须是抽象的】。如果使用的是JDK1.8+允许使用default在接口中定义默认实现,这个实现允许在实现类中重新定义覆盖
接口中没有属性,只能定义常量,它提供一些常量,实现它的类可以共享这些常量
接口可以给出访问控制符,用public修饰的是公共接口,到处可见;如果定义接口没有范围限定词,则只能在同包中访问

接口中只能定义常量和抽象方法

接口中只能定义公共的常量,接口中的属性默认是public static final类型的,必须是public static final类型的
接口中只能定义公共的抽象方法, 只有在JDK1.8+中可以使用default关键字定义方法实现。接口中的方法默认是public abstract类型的,而且必须是public abstract类型的。只有在JDK1.8+中可以使用default关键字定义方法默认实现,同时允许在实现类中覆盖重新定义
接口不能被实例化,只能通过实现类所实现,但是可以用于声明变量的类型。
        接口 变量名=new 实现接口类();
接口没有构造函数
接口中的抽象方法必须在非抽象子类中提供实现,这个实现可以是继承来的

接口的特殊特征

一个类只能有一个父类!
一个类可以实现多个接口!
一个接口可以继承多个接口

接口的作用

统一访问
解耦 通过接口可以隔离具体实现
解耦就是在使用者和实现者之间没有关系。 无论实现者如何改变实现,对于使用者使用不会变化

接口和抽象类的异同点

相同点:都是不断向上抽取而来的
不同点
  • 抽象类需要被继承,而且只能单继承
  • 接口需要被实现,而且可以多实现
抽象类中可以定义抽象方法和非抽象方法,子类继承后可以直接使用非抽象方法
接口中可以定义抽象方法和default方法,抽象方法必须由子类去提供实现;JDK1.8+中允许接口中的方法有默认实现,实现类中可以直接使用默认实现,允许覆盖定义
抽象类的继承是is a关系,在定义该体系的基本共性内容
接口的实现是like a关系,在定义体系额外功能
接口中只能定义常量,而且必须被初始化,抽象类中可以定义属性,允许在声明时直接初始化,也可以不初始化,同时允许定义常量
接口中的公共方法应该全部是抽象的,JDK1.8+版本中可以通过default关键字定义方法的默认实现,允许定义静态方法,JDK1.9开始可以定义私有方法;抽象类中可以有抽象方法也可以有普通方法

如何使用接口

一般使用接口隔离具体实现,可以将类之间的相互依赖变为类对接口的依赖。例如出差类和会飞的东西是通过会飞的接口进行隔离,这样不管出差类需要修改或者会飞的东西需要修改,都不会相互影响
如果一组相关的类中有公共的方法和特殊的方法,可以使用抽象类,在抽象类中固化公共的方法【算法骨架】,而无需具体子类重复实现;但是在抽象类中无法实现的方法可以延迟到子类中再实现。例如排序器BubbleSorter,其中抽象类BubbleSorter固化了所使用的冒泡排序算法,而将无法实现的bigger比较算法延迟到BubbleSorter的子类PigSorter中实现,同时PigSorter中也不需要重新定义排序算法
最佳软件开发实践:先定义接口规范调用方法,在使用抽象类实现接口定义公共方法,最后再定义具体子类实现所有的方法

接口和抽象类的使用场景

从设计层面看,抽象类体现继承关系is a,它主要描述类的从属关系或者父子关系,抽象类和它的派生类之间是典型的IS-A关系,即子is a父。
interface可以多实现,而且不要求实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。它主要描述的是类型间的行为合同,接口和它的实现类之间是典型的CAN-DO关系,即子can do父。
为什么接口需要默认方法
在接口添加默认方法不需要修改实现类,接口新增的默认方法在实现类中直接可用。
另外还要注意默认方法冲突问题。

java基础--接口相关推荐

  1. java基础-----接口

    接口 : 英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数.从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象.在Java中,定一个接口的形式如下: [publ ...

  2. [Java 基础]接口

    抽象类和抽象方法 抽象方法 在面向对象编程语言中抽象方法指一些只有方法声明而没有具体方法体的方法抽象方法一般存在于抽象类或接口中. java中,抽象方法就是以 abstract 修饰的方法,只需要声明 ...

  3. Java基础---接口是啥?

    接口 接口:是一个特殊的抽象类,规定了接口的使用者和接口的实现者之间的规范 定义:interface 接口名 {} 特点:接口中定义的属性都是公开静态常量(即使不加修饰符,也默认是public sta ...

  4. Java基础---接口的使用

    接口 接口:是一个特殊的抽象类,规定了接口的使用者和接口的实现者之间的规范 定义:interface 接口名 {} 特点:接口中定义的属性都是公开静态常量(即使不加修饰符,也默认是public sta ...

  5. java基础/接口与继承1(0.96万字)

    文章目录 接口 创建接口 使用接口 什么样的情况下该使用接口? 对象转型 明确引用类型与对象类型的概念 子类转父类(向上转型) 父类转子类(向下转型) 总结 没有继承关系的两个类,互相转换,一定会失败 ...

  6. java基础[接口]

    接口作用:将两个不同的东西连接起来,让他们共同去工作! 具体类:定义某一具体的事物: 抽象类:定义某一类不同种的事物: 接口:定义不同类型的不同种事物,但是却有共同的行为,注重事物的行为,而不是事物的 ...

  7. Java基础——接口

    一.接口语法 接口的创建 interface //接口不能直接创建对象 public interface grammar {//定义的属性都是公有静态属性(默认也是)String name = &qu ...

  8. java基础-接口与实现

    接口的定义和类的定义很相似,可以分为接口声明和接口体积,和类不同的是,使用关键字interface来声明自己是一个接口. 格式如下; interface 接口的名字 这里需要注意的是: 1.如果一个非 ...

  9. java基础--接口(interface)

    接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...

  10. [Java基础]接口基础

    接口:

最新文章

  1. Windows 10如何使用文件历史记录备份个人文件
  2. springboot+vue前后端分离实现宿舍管理系统
  3. hdu oj 2020 绝对值排序
  4. Atlas Samples Suse Linux 10.1
  5. windows 下搭建python虚拟环境
  6. python将字典内容存入mysql
  7. input添加disabled属性出现的移动端兼容问题
  8. linux-squirrel
  9. linux内核编译与新内核启用
  10. Redis学习之单机数据库(二)
  11. sdk怎么用_PLC不支持OPC UA怎么办?别问了看完你就懂了
  12. BatchNorm中forward未被调用原因
  13. idea 拉取gitee代码_手把手撸一个 IDEA 插件
  14. (转载)Android content provider基础与使用
  15. 【转】数字签名与数字证书
  16. 【ETWVRP】基于matlab遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1221期】
  17. 百度文库需要使用下载券的文档怎么下载
  18. Python读写修改Shapefile
  19. 大数据平台的SQL查询引擎有哪些—SparkSQL
  20. 联通loid认证_光纤LOID 认证 需要填写的用户名是什么?有人说不需要填写密码。为什么我每次认证都是超时?...

热门文章

  1. [工具] Mac下一键APK逆向环境
  2. 福利工具,如何利用小程序免费下载积分文件呢?【第02期】
  3. k3刷机 重置_斐讯K3刷机教程:一直重启、忘了密码怎么办?手机刷机包下载
  4. 【loadrunner】测试手机app性能
  5. 国产电影凭什么霸屏电影院?
  6. mysql触发器更新自己表_mysql触发器实例:更新表数据之前触发
  7. linux安装pip3教程,linux下pip的安装步骤及使用详解
  8. 短视频怎么才能做好内容付费?
  9. 电脑连接Wifi,只能上QQ不能上网。关键字:无Internet访问权限。
  10. 干货!仓储规划设计方法论