IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 接口(interface) -> 正文阅读

[Java知识库]接口(interface)

目录

接口的初步理解

接口的定义方式

接口的使用

接口延伸出的设计模式——代理模式


注:Java不支持子父类的多继承,但是接受接口的多重实现

接口的初步理解

1、接口用interface进行定义

2、在Java中接口和类是并列结构

3、接口不能实例化

4、只有在实现了接口的类对于接口中的抽象方法全部都实现了之后,才能够成功实现

5、Java接口的出现弥补了Java中类的单继承的缺陷

6、接口实际上可以看作是一种规范和契约

接口的定义方式

接口的定义方式又有一道分水岭

JDK7之前

接口成员

>全局常量:public static final

>抽象方法:public abstract

JDK8之后

除了全局变量和抽象方法之外,还有静态方法和默认方法(接口的定义越来越接近于类)

定义方式(Java7)

权限修饰词 interface 接口名{

接口的成员

}

例如:

public interface inter {

    public static final int n = 720000;

    public abstract void eat();

}

如图所示就是一个完整的接口,接口中的方法因为是抽象方法,就不能够有方法体

注:接口中绝对不能定义构造器,否则会报出“Interface cannot have constructors”即接口中不能含有构造器

还需要注意的点是,全局常量前面的public static final是可以省略的,抽象方法前面的public abstract都是可以省略的,因为只要写在接口中的方法和变量,就一定是全局常量和抽象方法

public interface inter {
    
    int n = 720000;

    void eat();

}
//只需要定义数据类型和返回值类型即可

现在使用一个类去实现接口

实验接口如下

public interface inter {
    int n = 720000;
    void eat();
    void sleep();
    int getAge();
}

如果Person这个类不能将所有的方法进行重写,那么将会报出“Class 'Person' must either be declared abstract or implement abstract method 'slaap()' in 'inter'”即Person类必须声明在inter中的抽象方法或者在接口inter中的抽象方法sleep()

继承父类和实现接口也可以同时存在

class 类名 extends 父类名 implements 接口1,接口2,接口3……

即为一个类,有且仅有一个父类,但是却可以实现无数接口

定义方式(Java8)

Java8中除了定义全局常量和抽象方法之外,还能定义静态方法、默认方法,这两种方法不仅可以存在,还可以有方法体

public interface inter {
    
    int n = 720000;
    
    void eat();
    
    void sleep();

    //默认方法
    
    public default void method()
    {
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
    }
    
    //静态方法

    public static void xixi()
    {
        System.out.println("嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻");
    }
}
//图中即为这两种方式的定义
//当静态方法被调用的时候就只能通过“接口.方法名”的方式调用,实现类(即为实现接口的类)
//不能够调用接口内的静态方法
//对于默认方法而言,可以进行调用,而且默认方法可以被重写

由上所知,如何判断接口中的函数是不是抽象的,就是通过该函数是否有函数体来判断

注:

1、如果实现类已经重写了默认方法,调用后会调用重写方法

2、如果子类(或者实现类)继承的父类和实现的接口中声明了同名同参的方法,那么子类在没有重写此方法的情况下,默认调用父类中同名同参的方法(类优先原则)

3、如果实现类中继承了多个接口,而这些被继承的接口中都定义了相同的同名同参的方法,那么在实现类还没有重写之前就会报出接口冲突

4、如果想用调用接口中的被重写之前的默认方法:仍然利用super去调用(注:此处不能够使用“接口.方法”的方式去调用,只能用上述那种)

接口的使用

class Computer {
    public void transferData(USB usb){

    };
}
public interface USB {
    void start();
    void stop();
}
class Flash implements USB{
    public void start()
    {
        System.out.println("U盘开始工作");
    }
    public void stop()
    {
        System.out.println("U盘结束工作");
    }
}

?

public class ComputerTest {
    public static void main(String[] args)
    {

        Computer com=new Computer();

        Flash flash=new Flash();

        com.transferData(flash);

    //此处也体现了多态性,方法transferData()中,形参处规定的类型是USB,是接口名
    //其意义就是只要传入实现了USB接口的类的对象,就能够传输成功
    //此处体现了多态性

    //同时在此处也能体现接口的规范作用
    //只有实现了USB接口的类才能够成功传入到Computer类的数据传输
    //换而言之就是只有达到了接口的规范才能够真的传输数据到Computer
    }
}

匿名实现类

public class ComputerTest {
    public static void main(String[] args)
    {
        Computer com=new Computer();
        //以下部分就是对于接口的匿名实现类的非匿名对象
        USB phone =new USB()
        //此处这个新new出来的对象有着明确名字,即为phone的对象
        //以下是对于这个没有明确名字的类进行描述
        //此处也能体现接口的多态性
        {
            @Override
            public void start() {
                System.out.println("手机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("手机结束工作");
            }
        };
    }
}
//以上代码实现了匿名对象的非匿名类
public class ComputerTest {
    public static void main(String[] args)
    {
        Computer com=new Computer();
        //以下对于对象的名字已经没有了,是匿名对象
        //只能表明这是一个实现了USB接口的匿名类创建的匿名对象
        com.transferData(new USB()
        {
            @Override
            public void start() {
                System.out.println("手机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("手机结束工作");
            }
        });
    }
}
//上述代码实现了匿名类的匿名对象

接口延伸出的设计模式——代理模式

为其他对象提供一种代理以控制对这个对象的访问

以下是例子,并进行解释

这里用网络连接作为一个例子

public interface Network {
    void browse();
}
//此处用一个接口作为规范
//基本可以用来判断这个主动连接的对象是否具备连接功能
//并且强制实现类去连接
class Sever implements Network{
    public void browse()
    {
        System.out.println("真实的服务器访问网络");
    }
}
//此处的类继承接口,证明它具有连接网络的的能力
//browse方法就是为了对网络进行连接
//此处是真的对网络进行连接
class ProxySever {

    //此处就是代理类,是整段代码比较难的地方

    private Network work;

    public ProxySever(Network work)
    //此处重写了构造器,但是不再提供空参构造器,此处的代理类是一定要传入一个
    //实现了Network的实现类的对象。如果他没有实现Network接口,那他就没有进入
    //代理类的必要,因为他不具备连接的功能
    {
        this.work=work;
        //将外部传入的实现了Network的实现类的对象赋给在代理类内部的私有化对象
    }
    public void check()
    {
        //此处就是一个代指,之后可以对check方法进行改写,就能进行复杂的检查
        System.out.println("联网之前的检查工作");
    }
    public void browse()
    //此处这个方法是连接方法,只要发出browse的连接操作,就会调用这个方法
    {
        check();
        //先进行检查
        work.browse();
        //之后再连接到之际上发起连接操作的设备的browse()方法
    }
}
//代理方法中的连接实际上是假连接,只有在main方法中创造的代理类实例对象主动连接
//才能够触发check方法和真实的连接

代理类仅负责控制于被代理类的连接,仅履行筛查工作,之后的连接工作仍在被代理类中实现,此时接口的作用就是提供一个规范的操作

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 11:57:32  更:2022-04-29 12:00:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:16:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码