接口——Java学习笔记

在学习过继承、多态和抽象类的基础上,我们又学习了接口。

接口

接口是Java语言中的一种引用类型,是一系列方法的声明,方法特征的合集,也是一种标准。

  • 如果说类的内部封装了成员变量、成员方法和构造方法;
  • 那么接口的内部主要封装了方法
    • 抽象方法(JDK7之前一直有)
    • 默认方法(JDK8加入)
    • 静态方法(JDK8加入)
    • 私有方法(JDK9加入)
  • 接口的定义和类相似,但是他使用interface关键字,他也会被编译成class文件,但是它不是类,而是一种引用数据类型
  • 接口不能创建对象,但是可以被是实现(implements),类似于被继承。
  • 一个实现接口的类,需要实现接口中所有的抽象方法,否则就将它定义为抽象类(让他的子类再去实现)
  • 接口的特点:
    • 接口中不能有构造方法,也不能创建对象
    • 接口中主要有抽象方法(只有方法声明,没有方法体)
    • 接口中的抽象方法只能用public修饰,不加默认也是public
    • 接口中的变量都是静态的常量,
      • 因为变量前面默认的修饰符就是public static final(写不写都一样)
      • 可以直接通过接口名访问(接口名.变量名)
    • 接口需要类来实现,一个类可以实现多个接口
    • 接口可以继承多个父接口,从而接口实现了多继承
接口的定义和实现

接口的定义:

interface 接口名{
    常量;
    抽象方法;
    静态方法;
    默认方法;
    私有方法;
}

接口的实现:

class 类名 implements 接口名{
    //其中要实现接口中的抽象方法
    //也可以重写接口中的默认方法
}
抽象方法

没有方法体,供子类实现

  • 使用abstract关键字修饰,但是在接口中可以省略

定义方法:

interface MyInter01{
    public abstract void method();//前面的修饰符都可以去掉
}

实现:

class InterImpl implements MyInter01{
    public void method(){
		System.out.println("类中实现的抽象方法");
    }
}
默认方法

供实现类 使用或者重写

  • 可以被子接口继承
  • 可以被实该接口的类继承
  • 子接口中如有同名默认方法,父接口的默认方法会被覆盖
  • 不能通过接口名调用
  • 需要通过接口实现类的实例进行访问
  • 使用default关键字修饰

定义方法:

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

调用:

默认方法可以直接继承,也可以重写,

class InterImpl implements MyInter01{
    public void method(){
		System.out.println("重写接口中的默认方法");
    }
}
静态方法

接口自己使用,属于接口

  • 可以直接使用接口名调用
  • 不可以通过实现类的类名或者实现类的对象调用
  • 使用static关键字修饰

定义方法:

interface MyInter01{
    public static void method(){
        System.out.println("MyInter01的静态方法");
    };
}

调用:

MyInter01.method();
私有方法

实际开发中,当多个默认方法有重复的内容时,就可以将这些内容抽取出来,封装到私有方法中,供这个接口自己使用

  • 私有方法和私有静态方法的区别:
    • 私有方法只能被默认方法调用
    • 私有静态方法可以被默认方法和静态方法调用
  • 使用private修饰

定义方法:

interface MyInter01{
    private void privateTest(){
        System.out.println("私有方法");
    }
    private static void priStaTest(){
        System.out.println("静态的私有方法");
    }
}

调用:

interface MyInter01{
    private void privateTest(){
        System.out.println("私有方法");
    }
    private static void priStaTest(){
        System.out.println("静态的私有方法");
    }
    public default void mothod(){
        privateTest();
        priStaTest();
    }
}
接口的多实现

在继承中一个子类只能继承一个父类,但是对接口而言,一个类可以实现多个接口,这就叫做接口的多实现。(一个类可以继承一个父类和多个接口类)

访问修饰符 class 类名 extends 父类 implements 接口1,接口2,接口3···{}
一个类中实现多个接口时(接口的多实现),出现的一些情况:
抽象方法有重名,只需要重写一次
interface MyInter01{
    public void method();
}

interface MyInter02{
    public void method();
}

class InterImpl implements MyInter01,MyInter02{
    //只需要实现一个抽象方法
    public void method(){

    }
}
默认方法有重名,必须重写一次
interface MyInter01{
    public default void method(){
        System.out.println("MyInter01的默认方法");
    };
}

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

class InterImpl implements MyInter01,MyInter02{
    //必须要重写一次默认方法
    public void method(){
        System.out.println("实现类中重写的默认方法");
    }

}
静态方法有重名时,不会发生冲突(因为静态方法只能使用自己的接口名调用)
interface MyInter01{
    public static void method(){
        System.out.println("MyInter01的静态方法");
    };
}

interface MyInter02{
    public static void method(){
        System.out.println("MyInter02的静态方法");
    };
}

class InterImpl implements MyInter01,MyInter02{
    public void a(){
        //调用方法不同,不会冲突
        MyInter01.method();
        MyInter02.method();
    }

}
接口的多继承

接口也能使用extends继承接口,并且可以继承多个接口(接口之间还是用逗号分隔开)

如果一个类实现了子接口,那么就要实现子接口和父接口中的所有抽象方法

(如果两个父接口中有重名的默认方法,也需要子接口来重写一次!)

interface MyInter01{
    //默认方法
    public default void method(){
        System.out.println("MyInter01的默认方法");
    };
    //MyInter01中的抽象方法
    void method01();
}

interface MyInter02{
    //默认方法
    public default void method(){
        System.out.println("MyInter02的默认方法");
    };
    //MyInter02中的抽象方法
    void method02();
}

//子接口MyInter03 继承父接口MyInter01和MyInter02
interface MyInter03 extends MyInter01,MyInter02{
    
    //两个父接口中有重名的默认方法method(),需要重写这个方法
    public default void method(){
        System.out.println("子接口MyInter03的默认方法");
    };
    
    //MyInter03中的抽象方法
    void method03();
}

//实现类实现子接口
class InterImpl implements MyInter03{
    //需要把父接口(MyInter01、MyInter02)和子接口(MyInter03)中的抽象方法全部实现
    @Override
    public void method01() {

    }

    @Override
    public void method02() {

    }

    @Override
    public void method03() {

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值