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知识库 -> Java面向对象篇(接口) -> 正文阅读

[Java知识库]Java面向对象篇(接口)

一、接口简述

1.1接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9)。

1.2接口定义(与类的定义方式类似):

1.2.1类使用class关键字:public class 类名称{属性,方法}

1.2.2接口使用Interface关键字:public interface? 接口名称{抽象方法,静态方法,默认方法,私有方法,常量}

提示:换成interface关键字后,编译生成的文件仍是.java-->.class字节码文件,但它不是类,而是另一种引用数据类型。引用数据类型:数组,类,接口。

1.3接口使用:

接口不能创建对象,但是可以被实现( implements ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。

二、接口中的方法以及实现

如果是java7,那么接口可以包含的内容有:1常量,2抽象方法
如果是java8,那么接口中可以另外包含的内容有:3、静态方法4、默认方法
如果是java9,那么接口中可以另外包含的内容有:5、私有方法

现在的java版本比较高,这五种方法都会用到。

2.1接口中的抽象方法:

2.1.1接口中的抽象方法定义:

在任何版本中的java中,接口都能定义抽象方法
public abstract 返回值类型 方法名称(参数列表);
注意事项:?1、接口中定义抽象方法,修饰符必须是两个固定的关键字 public abstract
??? ???????????????2、这两个修饰符可以选择性的省略
???????????????????3、方法的三要素可以随意定义

2.1.2接口中抽象方法的实现:
1、接口不能直接使用,必须要有一个“实现类”来实现该“接口”
格式:
??? public class 实现类名称? implements 接口名称{
??? //
??? }

2、接口的实现类必须覆盖重(实现)写接口中所有的的抽象方法
??? 实现:去掉abstract关键字,加上方法体,大括号
3、创建实现类的对象进行使用
注意事项:如果实现类没有覆盖重写接口中所有的抽象类,那么这个实现类就必须是抽象类

2.1.3定义一个MyInterfaceAbstract接口:

public interface MyInterfaceAbstract {
    //抽象方法1
    public abstract  void eat1();
    //抽象方法2
    abstract void eat2();
    //抽象方法3
    public void eat3();
    //抽象方法4
    void eat4();
}

?2.1.4定义一个实现类实现该接口抽象方法:MyInterfaceAbstractImpl

public class MyInterfaceAbstractImpl implements MyInterfaceAbstract{
    @Override
    public void eat1() {
        System.out.println("第一次吃");
    }

    @Override
    public void eat2() {
        System.out.println("第二次吃");
    }

    @Override
    public void eat3() {
        System.out.println("第三次吃");
    }

    @Override
    public void eat4() {
        System.out.println("第四次吃");
    }
}

在这个实现类MyInterfaceAbstractImpl中把接口MyInterfaceAbstract中的抽象方法都实现了,如果没有全部实现,那么这个类是一个抽象类。

2.1.5创建实现类对象:

public interface Demo01Interface {
    public static void main(String[] args) {
         //错误写法!不能直接new接口对象使用。
//        MyInterfaceAbstract inter = new MyInterfaceAbstract();

       //  创建实现类的对象使用
        MyInterfaceAbstractImpl impl = new MyInterfaceAbstractImpl();
        impl.eat1();
        impl.eat3();
        impl.eat2();
        impl.eat4();

    }
}

输出结果:

2.2接口中的静态方法:

从java8开始,接口中允许定义静态方法。
格式:
??? public static 返回值 参数名(参数列表){方法体}

提示:就是将abstract或者default换成static即可,带上方法体。

2.2.1创建接口写入静态方法:

public interface MyInterfaceStatic {
    public static void methodStatic(){
        System.out.println("这是接口的静态方法");
    }
}

创建实现类,在main方法中实现方法:

public class Demo03Interface implements  MyInterfaceStatic{
    public static void main(String[] args) {
        Demo03Interface Impl = new Demo03Interface();
        //错误写法
//        Impl.methodStatic();
        //正确写法
        MyInterfaceStatic.methodStatic();

    }
}

输出结果:

2.3接口中的默认方法

2.3.1
从java8开始,接口里允许定义默认方法。
格式:
??? public default 返回值类型? 方法名称(参数列表){
??? 方法体
???? }

作用:接口当中的默认方法,可以解决接口升级问题

2.3.2创建接口添加默认方法

public interface MyInterfaceDefault {
    //抽象方法
     public abstract  void method();
    //添加抽象方法
//     public abstract  void method1();//添加完后面的直接报错,因为接口里的抽象方法全都要实例化

     //定义默认方法
    public default void eat(){
        System.out.println("这就是新添加的默认方法");
    }
}

2.3.3创建实现类A

public class MyInterfaceDefaultA implements MyInterfaceDefault {
    @Override
    public void method() {
        System.out.println("方法实现:AAA");
    }
}

创建实现类B:

public class MyInterfaceDefaultB implements MyInterfaceDefault{


    @Override
    public void method() {
        System.out.println("静态方法重写");
    }

    @Override
    public void eat() {
//        MyInterfaceDefault.super.eat();
        System.out.println("实现类B覆盖重写默认方法");
    }
}

2.3.4创建实现类对象

public class Demo02Interface {
    public static void main(String[] args) {
        //创建实现类对象
        MyInterfaceDefaultA a = new MyInterfaceDefaultA();
        a.method();//调用抽象方法,实际运行出来的是右侧的实现类
        //调用默认方法,如果实现类中没有,会向上找接口
        a.eat();
        System.out.println("=========");

        MyInterfaceDefaultB b = new MyInterfaceDefaultB();
        b.method();
        b.eat();
    }
}

运行结果

2.4接口中的私有方法;

从Java 9开始,接口当中允许定义私有方法。
1. 普通私有方法,解决多个默认方法之间重复代码问题
格式:
private 返回值类型 方法名称(参数列表) {
??? 方法体
}

2. 静态私有方法,解决多个静态方法之间重复代码问题
格式:
private static 返回值类型 方法名称(参数列表) {
??? 方法体
}

2.4.1

问题描述:
我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
但是这个共有方法不应该让实现类使用,应该是私有化的。

2.4.2创建接口写默认方法:

public interface  MyInterfacePriaveA {
    //默认方法1
    public default void methodDefault1(){
        System.out.println("默认方法1");
//        System.out.println("aaa");
//        System.out.println("bbb");
//        System.out.println("ccc");
        method3();
    }
    //默认方法2
    public default void methodDefault2(){
        System.out.println("默认方法2");
//        System.out.println("aaa");
//        System.out.println("bbb");
//        System.out.println("ccc");
        method3();
    }
    //将默认方法里的共有方法写成一个
    private  void method3(){
        System.out.println("aaa");
        System.out.println("bbb");
        System.out.println("ccc");
    }
}

?2.4.3创建实现类,在main方法中创建对象调用方法

public class MyInterfavePrivateAlmpl implements MyInterfacePriaveA {
    public static void main(String[] args) {
        MyInterfavePrivateAlmpl A = new MyInterfavePrivateAlmpl();

        A.methodDefault();
    }
    public void methodDefault(){
        methodDefault1();
        methodDefault2();
        //直接访问接口中的默认方法是错误的
//        method3();
    }
}

运行结果:

?2.5接口中的常量

接口当中也可以定义“成员变量”,但是必须使用public static final三个关键字进行修饰。
从效果上看,这其实就是接口的【常量】。
格式:
public static final 数据类型 常量名称 = 数据值;

备注:
一旦使用final关键字进行修饰,说明不可改变。

注意事项:
1. 接口当中的常量,可以省略public static final,注意:不写也照样是这样。
2. 接口当中的常量,必须进行赋值;不能不赋值。
3. 接口中常量的名称,使用完全大写的字母,用下划线进行分隔。(推荐命名规则)

2.5.1创建接口设置常量

public interface MyInterfaceConts {
    public static final int AGE = 20;
    public static final String STR_IN_G = "wkxlks";
    public static final  boolean A  = true;
}

2.5.2测试类测试常量

public class Demo05Interface {
    public static void main(String[] args) {
        //访问接口中的常量
        //类名称.属性名
        System.out.println(MyInterfaceConts.AGE);
        System.out.println(MyInterfaceConts.A);
        System.out.println(MyInterfaceConts.STR_IN_G);
    }
}

运行结果?

三、子类继承父类并实现多个接口

使用接口的时候,需要注意:

1. 接口是没有静态代码块或者构造方法的。
2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
??? // 覆盖重写所有抽象方法
}

3. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
5. 如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
6. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。

实际操作:

接口A:

public interface MyInterfaceA {
//    static{//错误写法,接口不能有静态代码块
//
//    }
//     public   MyInterfaceA{//接口不能有构造方法
//
//    }
    public abstract void methodA();//抽象方法
    public abstract void methodAbs();//抽象方法
    public default void methodDefault(){
        System.out.println("默认方法:AAA");
    }
}

接口B:

public interface MyInterfaceB {
    public abstract void methodB();//抽象方法

    public abstract void methodAbs();//抽象方法

    public default void methodDefault() {
        System.out.println("默认方法:BBB");
    }
}

*如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类

public abstract class MyInterfaceAbstract implements MyInterfaceA,MyInterfaceB {
    @Override
    public void methodA() {

    }

    @Override
    public void methodAbs() {

    }

    @Override
    public void methodDefault() {
    }
}

*如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。

*如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。

public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB{
    @Override
    public void methodA() {
        System.out.println("覆盖重写A");
    }

    @Override
    public void methodB() {
        System.out.println("覆盖重写B");

    }

    @Override
    public void methodAbs() {
        System.out.println("覆盖重写AB接口都有的方法");

    }

    @Override
    public void methodDefault() {
        System.out.println("覆盖重写多个接口当中冲突的默认方法");

    }
}

* 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。

父类

public class Fu {
    public void method(){
        System.out.println("父类方法");
    }
}

接口

public interface MyInterface {
    public default void method(){
        System.out.println("接口的默认方法");
    }
}

子类

public class Zi extends Fu implements MyInterface{

}

测试类

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

    Zi zi = new Zi();
    zi.method();
    }
}

运行结果

?四、接口的多继承

1. 类与类之间是单继承的。直接父类只有一个。
2. 类与接口之间是多实现的。一个类可以实现多个接口。
3. 接口与接口之间是多继承的。

注意事项:
1. 多个父接口当中的抽象方法如果重复,没关系。
2. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着default关键字】。

MyInterfaceA接口

public interface MyInterfaceA {
    public abstract void methodA();
    public abstract void methodCommon();
    public default void methodDefault(){
        System.out.println("AAA");
    }
}

MyInterfaceB接口

public interface MyInterfaceB {
    public abstract void methodB();
    public abstract void methodCommon();
    public default void methodDefault(){
        System.out.println("BBB");
    }
}

interface? 继承? interfaceA,interfaceB

public interface MyInterface extends MyInterfaceA,MyInterfaceB{
    public abstract void method();

    @Override
    default void methodDefault() {//默认方法重复,覆盖重写,保留权限修饰符default
        MyInterfaceA.super.methodDefault();
    }
}

此时,子接口interface中有四个子方法:
methodA 来源于接口A
methodB 来源于接口B
methodCommon 同时来源于接口A和B
method 来源于我自己

实现类MyInterfaceImpl实现接口interface:

public class MyInterfaceImpl implements MyInterface{
    @Override
    public void method() {

    }

    @Override
    public void methodA() {

    }

    @Override
    public void methodB() {

    }

    @Override
    public void methodCommon() {

    }

}

关于接口篇完结,欢迎收藏,欢迎讨论

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:39:19 
 
开发: 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 4:44:17-

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