一、基本概念

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

如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。

范例:定义一个接口

interface A{//定义一个接口

    public static final String MSG = "hello";//全局常量
public abstract void print();//抽象方法
}

二、接口的使用

1、由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;
(2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象的向上转型进行实例化。

范例:

package com.wz.interfacedemo;

interface A{//定义一个接口A

    public static final String MSG = "hello";//全局常量

    public abstract void print();//抽象方法
} interface B{//定义一个接口B public abstract void get();
} class X implements A,B{//X类实现了A和B两个接口 @Override
public void print() {
System.out.println("接口A的抽象方法print()");
} @Override
public void get() {
System.out.println("接口B的抽象方法get()");
} } public class TestDemo { public static void main(String[] args){ X x = new X();//实例化子类对象
A a = x;//向上转型
B b = x;//向上转型 a.print();
b.get();
} }

运行结果:

接口A的抽象方法print()
接口B的抽象方法get()

以上的代码实例化了X类的对象,由于X类是A和B的子类,那么X类的对象可以变为A接口或者B接口对象。我们把测试主类代码改一下:

public class TestDemo {

    public static void main(String[] args){

        A a = new X();

        B b = (B) a;
b.get(); } }

运行结果:

接口B的抽象方法get()
  • 1

好,没任何问题,我们再来做个验证:

public class TestDemo {

    public static void main(String[] args){

        A a = new X();

        B b = (B) a;
b.get(); System.out.println(a instanceof A);
System.out.println(a instanceof B); }

运行结果:

接口B的抽象方法get()
true
true

我们发现,从定义结构来讲,A和B两个接口没有任何直接联系,但这两个接口却拥有同一个子类。我们不要被类型和名称所迷惑,因为实例化的是X子类,而这个类对象属于B类的对象,所以以上代码可行,只不过从代码的编写规范来讲,并不是很好。

2、对于子类而言,除了实现接口外,还可以继承抽象类。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:

class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}

范例:

interface A{//定义一个接口A

    public static final String MSG = "hello";//全局常量

    public abstract void print();//抽象方法
} interface B{//定义一个接口B public abstract void get();
} abstract class C{//定义一个抽象类C
public abstract void change();
} class X extends C implements A,B{//X类继承C类,并实现了A和B两个接口 @Override
public void print() {
System.out.println("接口A的抽象方法print()");
} @Override
public void get() {
System.out.println("接口B的抽象方法get()");
} @Override
public void change() {
System.out.println("抽象类C的抽象方法change()"); } }

对于接口,里面的组成只有抽象方法和全局常量,所以很多时候为了书写简单,可以不用写public abstract 或者public static final。并且,接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没有写上public,那么最终的访问权限也是public,注意不是default。以下两种写法是完全等价的:

interface A{
public static final String MSG = "hello";
public abstract void print();
}

等价于

interface A{
String MSG = "hello";
void print();
}

但是,这样会不会带来什么问题呢?如果子类子类中的覆写方法也不是public,我们来看:

package com.wz.interfacedemo;

interface A{

    String MSG = "hello";

    void print();
} class X implements A{ void print() {
System.out.println("接口A的抽象方法print()");
} } public class TestDemo {
public static void main(String[] args){ A a = new X();
a.print();
}
}

运行结果:

Exception in thread "main" java.lang.IllegalAccessError: com.wz.interfacedemo.X.print()V
at com.wz.interfacedemo.TestDemo.main(TestDemo.java:22)

这是因为接口中默认是public修饰,若子类中没用public修饰,则访问权限变严格了,给子类分配的是更低的访问权限。所以,在定义接口的时候强烈建议在抽象方法前加上public ,子类也加上:

interface A{

    String MSG = "hello";

    public void print();
} class X implements A{ public void print() {
System.out.println("接口A的抽象方法print()");
} }

3、在Java中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。

范例:

interface A{
public void funA();
} interface B{
public void funB();
} //C接口同时继承了A和B两个接口
interface C extends A,B{//使用的是extends
public void funC();
} class X implements C{ @Override
public void funA() { } @Override
public void funB() { } @Override
public void funC() { } }

由此可见,从继承关系来说接口的限制比抽象类少:
(1)一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;
(2)一个子类只能继承一个抽象类,却可以实现多个接口(在Java中,接口的主要功能是解决单继承局限问题)

4、从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口(但从实际的开发来讲,用户自己去定义内部抽象类或内部接口的时候是比较少见的),范例如下,在接口中定义一个抽象内部类:

interface A{
public void funA(); abstract class B{//定义一个抽象内部类
public abstract void funB();
}
}

在接口中如果使用了static去定义一个内接口,它表示一个外部接口:

interface A{
public void funA(); static interface B{//使用了static,是一个外部接口
public void funB();
}
}
class X implements A.B{ @Override
public void funB() { } }

三、接口的实际应用(标准定义)

在日常的生活之中,接口这一名词经常听到的,例如:USB接口、打印接口、充电接口等等。

如果要进行开发,要先开发出USB接口标准,然后设备厂商才可以设计出USB设备。

现在假设每一个USB设备只有两个功能:安装驱动程序、工作。
定义一个USB的标准:

interface USB {   // 操作标准
public void install() ;
public void work() ;
}

在电脑上应用此接口:

class Computer {
public void plugin(USB usb) {
usb.install() ;
usb.work() ;
}
}

定义USB设备—手机:

class Phone implements USB {
public void install() {
System.out.println("安装手机驱动程序。") ;
}
public void work() {
System.out.println("手机与电脑进行工作。") ;
}
}

定义USB设备—打印机:

class Print implements USB {
public void install() {
System.out.println("安装打印机驱动程序。") ;
}
public void work() {
System.out.println("进行文件打印。") ;
}
}

定义USB设备—MP3:

class MP3 implements USB {
public void install() {
System.out.println("安装MP3驱动程序。") ;
}
public void work() {
System.out.println("进行MP3拷贝。") ;
}
}

测试主类:

public class TestDemo {
public static void main(String args[]) {
Computer c = new Computer() ;
c.plugin(new Phone()) ;
c.plugin(new Print()) ;
c.plugin(new MP3());
}
}

运行结果:

安装手机驱动程序。
手机与电脑进行工作。
安装打印机驱动程序。
进行文件打印。
安装MP3驱动程序。
进行MP3拷贝。

可以看出,不管有多少个USB接口的子类,都可以在电脑上使用。
在现实生活中,标准的概念随处可见,而在程序里标准使用接口定义的。

Java接口 详解(一)的更多相关文章

  1. Java接口 详解(二)

    上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...

  2. java 接口详解

    定义接口 接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口.Java 接口本身没有任何实现,只描述 public 行为,因此 Java 接口比 Java 抽象类更抽象化.Jav ...

  3. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. “全栈2019”Java第八十三章:内部类与接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  6. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  7. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  9. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

随机推荐

  1. Solidworks如何保存为网页可以浏览的3D格式

    1 如图所示3D装配图,在Solidworks中可以旋转,缩放.   2 我想要另存为在浏览器中可以缩放,旋转的格式.如下所示(我的装配图初步.htm)   3 步骤是,先在Solidworks中出版 ...

  2. 怎样mac上安装apk到连接数据线的手机

    高大上的mac俺也用了一段时间了.不知道大家有木有同一个烦恼.曾经在win上的时候仅仅要安装了应用宝之类的手机助手.就能够双击APK,直接安装到连接数据线的手机上,非常方便哈,可是mac上不行.近期找 ...

  3. Flume 开发人员指南V1.5.2

    介绍 概述 Apache Flume是一个用来从非常多不同的源有效地收集.聚集和移动大量的日志数据到一个中心数据仓库的分布式的,可靠的和可用的系统. Apache Flume是Apache软件基金会的 ...

  4. Free Code Camp社区对数百计编程学习者进行的统计希望告诉你什么?

    文章来源:https://www.sdk.cn/news/5044 著名编程学习社区Free Code Camp对超过1.5万名编程学习者进行了调查.其中有一个问题为:“你对哪个编程职位最感兴趣?”有 ...

  5. eclipse 安装java web插件

    1.eclipse java web搭建以及tomcat配置: http://www.cnblogs.com/yangyxd/articles/5615965.html 注意选择Eclipse IDE ...

  6. vuex mapState使用

    <template> <div> {{count}} <button @click="handleIncrease">+5</button ...

  7. 翻翻git之---一个丰富的通知工具类 NotifyUtil

    转载请注明出处王亟亟的大牛之路 P1(废话板块.今天还加了个小广告) 昨天出去浪,到家把麦麦当当放出来玩一会就整到了12点多..早上睡过头了. .简直心酸. ... 近期手头上有一些职位能够操作,然后 ...

  8. boost库shared_ptr实现桥接模式

    主程序 /*将抽象部分与实现部分分离,使它们都能够独立的变化*/ #include "bridge.h" int main() { cout <<"main ...

  9. HTTP基础(整理)

    前一段时间看了有关这个协议的相关文档,对这个协议有了新的理解,这里整理一下. http是应用层面向对象的协议. 它有以下几个特点: 1.  支持客户服务器模式(这是废话,不支持这个模式怎么工作) 2. ...

  10. 数据存储之Archiver、Unarchiver、偏好设置

    数组的归档 对象的归档 NSData多个对象的归档 NSArray多个对象的归档 偏好设置的存储 1.NSString.NSDictionary.NSArray.NSData.NSNumber等类型的 ...