接口相关基础内容及注意事项

目录

一、接口中成员变量的特点

        1、成员变量

        2、构造方法

        3、成员方法

二、接口和类之间的关系

        1、类和类之间的关系

        2、类和接口之间的关系

        3、接口和接口之间的关系

三、JDK8开始接口中新增的方法

        1、JDK8以后新增的默认方法

        2、JDK8以后接口当中新增的静态方法

        3、JDK9新增的私有方法

四、接口的应用

五、适配器设计模式

课后习题及答案


一、接口中成员变量的特点

        1、成员变量

                只能是常量

                默认修饰符:public static final(就算不写,Java也会自动补上)

                        public:在所有地方都可以使用接口的常量

                        static:为了方便调用,用接口名.常量的名称就可以了

                        final:接口是一种规则,规则是不能改变的,接口里面的成员变量都是常量,会用final去修饰。

        2、构造方法

                没有构造方法

        3、成员方法

                只能是抽象方法

                默认修饰符:public abstract

                JDK7以前:接口只能定义抽象方法

                JDK8的新特性:接口中可以定义有方法体的方法

                JDK9的新特性:接口中可以定义私有方法

二、接口和类之间的关系

        1、类和类之间的关系

                继承关系。只能单继承,不能多继承,但可以多层继承

        2、类和接口之间的关系

                实现关系。可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口(在实现类当中,如果实现多个接口的话,那么要把所有的抽象方法全部重写才可以)(多个接口有重名的方法时,我们只需要重写一次就可以了,既表示重写了Inter1中的method1方法,又表示重写了Inter2里面的method1方法)

        3、接口和接口之间的关系

                继承关系。既可以单继承也可以多继承(如果实现类实现了下面的子接口的时候,就需要重写这个体系中所有的抽象方法)

三、JDK8开始接口中新增的方法

        JDK7以前:接口只能定义抽象方法

        JDK8的新特性:接口中可以定义有方法体的方法(分为默认方法和用static静态修饰的静态方法)

        JDK9的新特性:接口中可以定义private修饰的私有方法

        1、JDK8以后新增的默认方法

                允许在接口中定义默认方法,需要使用关键字default修饰

                作用:解决接口升级问题

                接口中默认方法的定义格式:

                        格式:public default 返回值类型 方法名 (参数列表){...}

eg.

public default void show(){......}

                接口中默认方法的注意事项

                        1、默认方法不是抽象方法,所以不强制被重写,重写的时候去掉default关键字

                        2、public可以省略,default不能省略(省略的话,Java会默认为抽象方法)

                        3、如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

        2、JDK8以后接口当中新增的静态方法

                允许在接口中定义静态方法,需要用static修饰

                接口中静态方法的定义格式:

                        格式:public static 返回值类型 方法名(参数列表){......}

eg.

public static void show(){......}

                接口中静态方法的注意事项

                        1、静态方法接口可以通过接口名调用,不能通过实现类名或者对象名调用

                        2、public可以省略,static不能省略(理由同上)

        3、JDK9新增的私有方法

                接口中私有方法的定义格式:

                        格式1:private 返回值类型 方法名(参数列表){.......}

eg.

private void show(){......}
//给默认方法(abstract)服务的

                        格式2:private static 返回值类型 方法名(参数列表){......}

eg.

private static void method(){......}
//为静态方法服务的

四、接口的应用

        1、把多个类都有可能用到的规则去定义为接口。对于实现类来讲,如果想要实现类拥有什么功能,那就实现对应的接口

        2、在一个方法中,参数写成了接口

eg.

public interface 运输{
    ......
}
public void 搬家(运输的接口 c){
    ......
}

那么我们在调用这个接口的时候就传递这个接口所有的实现类对象。这个就叫接口的多态。当传递过来后就实现了:

        接口类型  j  =  new  实现类对象();

在运行的时候也会执行编译看左边,运行看右边的原则

五、适配器设计模式

        设计模式:是一套被反复使用,多数人知晓的,经分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性、程序的复用性。

        简单理解:设计模式就是各种套路

        适配器设计模式:解决接口对接口实现类之间的矛盾问题

        1、当接口抽象对象过多,但只需要其中的一部分的时候,就可以用适配器设计模式

        2、书写步骤:

                编写中间类:接口名Adapter,表示中间适配器,用它实现对应的接口,对接口中抽象方法进行空实现(即方法体空着不写)让真正的实现类继承中间类,并重写需要的方法。为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

课后习题及答案

题目:编写标准的JavaBean类

我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球

代码如下:先创建父类Person

//因为现在我不想让外界去直接创建人的对象
//因为直接创建顶层父类“人”的对象此时是没有意义的
//所以就把它写为抽象类
public abstract class Person {
    private String name;
    private int age;
    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

再创建Person的两个字类Spoter(运动员)和Coach(教练)

运动员的代码如下:

public abstract class Sporter extends Person{
    public Sporter() {
    }

    public Sporter(String name, int age) {
        super(name, age);
    }

    //写成抽象的是因为下面的运动员学的内容不一样,需要重写
    public abstract void study();
}

教练代码如下:

public abstract class Coach extends Person{
    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}

跟乒乓其相关的会说英语,我们写一个接口,接口名叫做English,让乒乓球教练和运动员去实现它。代码如下:

public abstract class Coach extends Person{
    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}

运动员的子类有乒乓球运动员和篮球运动员

我们分别写这两个字类,代码如下:

乒乓球运动员:

public class PingpangSporter extends Sporter implements English{
    public PingpangSporter() {
    }

    public PingpangSporter(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员在学习如何打乒乓球");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球运动员在说英语");
    }
}

篮球运动员代码如下:

public class Basketballer extends Sporter{
    public Basketballer() {
    }

    public Basketballer(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("篮球运动员在学习如何打篮球");
    }
}

教练的子类分别是乒乓球教练和篮球教练,代码如下:

乒乓球教练:

public class TeachPingpang extends Coach implements English{
    public TeachPingpang() {
    }

    public TeachPingpang(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("乒乓球教练在教乒乓球运动员打乒乓球");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球教练在说英语");
    }
}

篮球教练代码如下:

public class TeachBasketball extends Coach{
    public TeachBasketball() {
    }

    public TeachBasketball(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("篮球教练在教蓝球运动员打篮球");
    }
}

接下来我们写一个测试类来运行一下

public class Test {
    public static void main(String[] args) {
        //创建运动员和教练的对象
        PingpangSporter pps = new PingpangSporter("刘诗雯", 23);
        System.out.println("乒乓球运动员: " + pps.getName() + "," + pps.getAge());
        pps.study();
        pps.speakEnglish();

        Basketballer be = new Basketballer("张三" , 23);
        System.out.println("篮球运动员: " + be.getName() + "," + be.getAge());
        be.study();

        TeachPingpang tpp = new TeachPingpang("lisi", 40);
        System.out.println("乒乓球教练: " + tpp.getName() + "," + tpp.getAge());
        tpp.teach();
        tpp.speakEnglish();

        TeachBasketball tbb = new TeachBasketball("王五",35);
        System.out.println("篮球教练: " + tbb.getName() + "," + tbb.getAge());
        tbb.teach();
    }
}

运行结果如下:

 以上就是咱们这次作业的步骤啦。接口的入门内容暂时就是这些。下期见

  • 32
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值