interface关键字的使用

interface能用来修饰的只要类

interface在jdk7及以前的使用
1.在jdk7中interface只能有全局变量和抽象方法
2.全局变量默认为 public static final
3.抽象方法默认为 public abstract
4.接口中无法定义构造器 ,意味着接口无法实例化。
5.接口的使用,使用 implements 来实现该接口(如果实现类覆盖了接口中的所有抽象方法,那么此类就是一个普通的类,则此实现类就可以实例化,如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类)
6.Java中接口是多实现的

interface  A{
    public abstract void getMethodA();
}

interface  B{
    public abstract void getMethodB();
    
}

class c implements A,B{

    @Override
    public void getMethodA() {
        
    }

    @Override
    public void getMethodB() {
        
    }
}

6.如果在一个类中需要同时继承一个类实现一个或者多个接口时,继承(extends)要写在实现(implements)的前面
在这里插入图片描述
7.类和类之间可以继承,类和接口之间可以实现,接口和接口之间也是可以继承的,并且该继承可以是多继承

interface  D{
    public abstract void getMethodD();
}

interface  E{
    public abstract void getMethodE();

}

//  接口之间的多继承
interface F extends D,E{

}

interface在jdk8的使用
1.interface关键字在jdk8版本当中除了可以定义全局变量和抽象方法之外,还可以定义静态方法和默认方法

interface  InterfaceJava8Test1{
    //  静态方法
    public static void getStaticMethod1(){
        System.out.println("InterfaceJava8Test1的静态方法");
    }

    //  默认方法
    public default void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test1的默认方法");
    }
}

2.再默认方法中如果不使用访问修饰符修饰符默认为public修饰符,而不是default修饰符 提示内容:修饰符public对于interface修饰的是多余的
在这里插入图片描述
3.接口中的静态方法和默认方法实现类中不需要继续方法的覆盖


interface  InterfaceJava8Test1{
    //  静态方法
    public static void getStaticMethod1(){
        System.out.println("InterfaceJava8Test1的静态方法");
    }

    //  默认方法
    public default void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test1的默认方法");
    }

}
// 	实现类 
class InterfaceJava8Test2 implements InterfaceJava8Test1{

}

4.接口中静态方法,实现类无法调用,它只能由接口本身调用
在这里插入图片描述
5.实现类的对象可以直接调用接口中的默认方法,并且接口本身无法调用自身的默认方法
在这里插入图片描述
6.实现了可以重写接口中的默认方法,再调用时,调用的为该类重写后的方法
7.如果子类或者实现类中继承的父类和实现接口中声明的同名同参数的方法一样,并且再其子类或者父类没有进行方法重写覆盖时,默认调用的是该父类中的方法 (只适用于方法,不适用于属性)

public class InterfaceJava8 {
    public static void main(String[] args)
    {
        InterfaceJava8Test2 in2=new InterfaceJava8Test2();
//        in2.getStaticMethod1(); //静态方法无法实现类来调用 只能由接口本身来调用
        in2.getDefaultMethod2();
        InterfaceJava8Test1.getStaticMethod1(); //  接口本身调用静态方法
//        InterfaceJava8Test1.getDefaultMethod2(); //接口本身无法调用自身的默认方法
        in2.getDefaultMethod3();  // 输出结果为父类中的结果

    }

}

interface  InterfaceJava8Test1{
    //  静态方法
    public static void getStaticMethod1(){
        System.out.println("InterfaceJava8Test1的静态方法");
    }

    //  默认方法
    public   default  void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test1的默认方法");
    }

    public  default void getDefaultMethod3(){
        System.out.println("InterfaceJava8Test1的默认方法2");
    }

}

class InterfaceJava8Test2   extends InterfaceJava8Super  implements InterfaceJava8Test1{

    public     void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test2的默认方法");
    }

}

class InterfaceJava8Super{
    //  同名同参数的方法
    public   void getDefaultMethod3(){
        System.out.println("InterfaceJava8Super中的方法");
    }
}

in2.getDefaultMethod3(); 输出结果为 :InterfaceJava8Super中的方法
8.如果实现类中实现了多个接口,并且多个接口中有相同的默认方法,而且实现类没有继承父类,或者说父类中没有声明和该接口同名同参数的方法,那么实现类必须重写接口中相同的多个默认方法 (接口冲突)

如下接口 InterfaceJava8Test1和接口InterfaceJava8Test3中有同名同参数的方法,并且InterfaceJava8Test2同时实现了该二个接口,默认情况下接口中的默认方法可以不写,当时同时继承了二个接口,并且该方法相同,再调用的时候不知道调用的是那个接口中的默认方法,所以子类InterfaceJava8Test2必须重写这个方法,然后调用该方法时,得到的将是子类重写的方法

interface  InterfaceJava8Test1{
    //  静态方法
    public static void getStaticMethod1(){
        System.out.println("InterfaceJava8Test1的静态方法");
    }

    //  默认方法
    public   default  void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test1的默认方法");
    }

    public  default void getDefaultMethod3(){
        System.out.println("InterfaceJava8Test1的默认方法2");
    }

}

interface  InterfaceJava8Test3{
    public  default void getDefaultMethod3(){
        System.out.println("InterfaceJava8Test1的默认方法2");
    }

}

class InterfaceJava8Test2   implements InterfaceJava8Test1,InterfaceJava8Test3{

    public     void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test2的默认方法");
    }

    @Override
    public void getDefaultMethod3()
    {
        
    }

}

9.再实现类中怎么得到接口中的原默认方法 格式:接口名.super.默认方法名

interface  InterfaceJava8Test1{
    //  静态方法
    public static void getStaticMethod1(){
        System.out.println("InterfaceJava8Test1的静态方法");
    }

    //  默认方法
    public   default  void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test1的默认方法");
    }

    public  default void getDefaultMethod3(){
        System.out.println("InterfaceJava8Test1的默认方法2");
    }

}

class InterfaceJava8Test2   implements InterfaceJava8Test1{

    public     void getDefaultMethod2(){
        System.out.println("InterfaceJava8Test2的默认方法");
    }

    public void myMethod(){
        InterfaceJava8Test1.super.getDefaultMethod3(); //   得到InterfaceJava8Test1中的getDefaultMethod3方法
    }

}
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏作者

Stone/

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值