interface的理解和使用(JDK8,推荐该版本)

JDK8:
      1- 全局常量:public static  final (这些都可以省略)
      2- 抽象方法:public abstract     (这些都可省略)
      3- 静态方法:public static void   (public可以略)
      4- 默认方法:public default void  (public可以略)

接口和父类内容代码块

接口代码块
/*
这个是JDK8的interface
特性:除了"全局常量"、"抽象方法"+还有"静态方法"、"默认方法"
 */
public interface interface_new {
    //静态方法
    public static void method1() {
        System.out.println("我是静态方法");
    }

    //默认方法——有写权限
    public default void method2() {
        System.out.println("我是默认方法");
    }

    //默认方法--不写权限
    default void method3() {
        System.out.println("我是默认方法,略写版本--接口");
    }
}

父类代码块
/*
测试-父类和接口中都有,同名同参数"方法"的使用---用谁
 */
public class SuperClass {
    public void method3() {
        System.out.println("我是默认方法----父类");
    }
}

一个小游戏,帮组对接口的理解,不理解的时候,可以选择看这个
/*
这个是一个对,接口的加深理解

1-问题:
    你老婆、老妈调水里,救谁的问题?
2-解决方法:
    你听你老爸的话--OR--自己选择救谁
 */

//老妈的求救
interface Mom {
    public default void help() {
        System.out.println("救你老妈--");
    }
}

//老婆的求救
interface Wife {
    public default void help() {
        System.out.println("救你老婆,我给你生孩子--");
    }
}

//老爸的注意
class Dad {
    public void help() {
        System.out.println("听爸爸说:救你老妈");
    }
}

//情况1---不停老爸的话,自己选择
 class HelpWho_Test implements Mom,Wife {
    @Override
    public void help() {
        Mom.super.help();//救老妈
        Wife.super.help();//救老婆
        System.out.println("我也不知道救谁呀");
    }
}
//情况2:听老爸的话
class HelpWho_Test2 extends Dad implements Mom,Wife {
    //如果你继承了,你父亲的话,就不用纠结,肯定听父亲的话
    /*
    想表达的是:
           实现到两个接口的"同参数,同名"的方法时,要做重写的选择
           但是在上面的情况遇到的时候,你继承了父类"同参数,同名"的方法时,就直接听父的话了
     */
}

主代码块

/*
测试"interface_new"
 */
public class SubClassTest {
    //2-去测试SubClass和interface_new
    public static void main(String[] args) {
        SubClass subClass = new SubClass();

        //问题1:调不出接口中的静态方法
        //总结:接口中定义的静态方法,只能通过接口来调用
        //subClass.method1();--调静态(不行)
        interface_new.method1();//--接口调静态,(可以)

        //问题2:要调用默认的方法
        //总结:用实现类的对象,可以调用接口中的默认方法
        //附加:如果实现类重写类接口中的默认方法,调用的时候,调用的是"重写后"的方法
        subClass.method2();
        subClass.method3();

        //问题4:父类和接口中都有,同名同参数"方法"的使用---用谁?
        //如果:子类(实现类)没有重写这个方法,调用的就是父类的方法
        //附加:和前面的父类和接口没有区别,区分开 +(这里是有父类优先的)---》 类优先原则
        //这里那method3做比较(前提,没有重写过)
        subClass.method3();

        //问题5:如果实现类,没有继承父类,而是实现类多个接口,并且多接口里面有"同名,同参数"的方法
        //总结:这时候,调用"同名,同参数"的方法的时候,报错---接口冲突
        //解决方法:我们要重写此方法

        subClass.MyMethod();



    }
}

//1-我写Subclass去实现interface_new这个接口
class SubClass extends SuperClass implements interface_new{
    //问题3-实现接口的方法,可以重写吗
    //回答:可以重写
    public void method2() {
        System.out.println("我是默认方法--被重写类 ");
    }

    public void method3() {
        System.out.println("太多人要我,我是被重写的method3");
    }

    //重点
    public void MyMethod() {
        method3();//调用自己"重写"的方法
        super.method3();//调用父类中声明的
        interface_new.super.method3();//调用接口中的"默认"方法
    }


}

posted on 2022-06-28 15:33  陈嘻嘻-  阅读(95)  评论(0编辑  收藏  举报

导航