zoukankan      html  css  js  c++  java
  • 关于接口的简单理解

    第五章 接口

    5.1 接口概述

    常见的猫狗案例 猫和狗它们仅仅提供一些基本功能。

    但有一些不是动物本身就具备的,比如:猫钻火圈,狗跳高等功能

    是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。

    5.2 接口特点

    A:接口用关键字interface表示

    [public] interface 接口名{
    }
    
    1. 接口中的方法不能具体实现,接口中的方法必须为抽象方法

    2. 接口中一般不定义变量,因为接口中的变量会被默认指定为 public static final 变量(只能是)

    B:类实现接口用implements 表示

    class 类名 implements 接口1,接口2,[....]{
    }
    

    1.一个类(非抽象类)可以遵循多个接口,并且需要实现(重写)该接口中所有的方法

    2.子类为抽象类的意义不大

    5.3 接口的成员特点

    A:成员变量
    只能是常量
    

    ​ 默认修饰符:public static final

    B:构造方法

    ​ 没有构造方法

    C:成员方法

    ​ 只能是抽象的

    ​ 默认修饰符:public abstract

    5.4 抽象类和接口的区别(重要)

    我们从我们实际设计场景中来切入这个话题

    先来举一个简单的例子:

    狗都具有 eat() 、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念

    //通过抽象类定义
    public abstract class Dog {
    	public abstract void eat();
    	public abstract void sleep();  
    }
    
    //通过接口定义
    public interface Dog {
        public abstract void eat();
        public abstract void sleep();
    }
    

    但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈 DrillFireCircle(),如何增加这个行为呢?

    思考:

    1. 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适

    2. 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适

    那么该如何解决呢 ? 我们可以仔细想一想,eat和sleep都是狗本身所应该具有的一种行为,而钻火圈这种行为则是后天训练出来的,只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内,所以我们考虑将这个单独的行为,独立的设计一个接口,其中包含DrillFireCircle()方法, Dog设计为一个抽象类, 其中又包括eat() 、sleep() 方法.

    一个SpecialDog即可继承Dog类并且实现DrillFireCircle()接口

    下面给出代码:

    //定义接口,含有钻火圈方法
    public interface DrillFireCircle() {
        public abstract void drillFireCircle();
    }
    
    //定义抽象类狗类
    public abstract class Dog {
        public abstract void eat();
        public abstract void sleep();
    }
     
    //继承抽象类且实现接口
    class SpecialDog extends Dog implements drillFireCircle {
        public void eat() {
          //....
        }
        public void sleep() {
          //....
        }
        public void drillFireCircle() () {
          //....
        }
    }
    

    总结:

    继承是一种 "是或不是"的关系,而 接口 实现则是 "有或没有"的关系。如果一个类继承了某个抽象类,它的子类则一定是抽象类的种类,而接口实现则是有或者没有、具备或者不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。

    结尾:

    如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_

    如果能帮到你的话,那就来关注我吧!

    在这里的我们素不相识,却都在为了自己的梦而努力 ❤

    一个坚持推送原创Java技术的公众号:理想二旬不止

    img

  • 相关阅读:
    Linux bash sh .source exec 的区别比较。
    flink1.10 Linux 集群安装
    有关Spark中FlatMap算子源码理解
    Flink有关于水位线(WaterMark)相关问题
    Flink中并行度相关问题
    关于spark中的ResultStage和ShuffleMapStage
    关于windows10共享WiFi问题
    外网映射
    Druid的问题
    《小学四则运算练习软件软件需求说明》结对项目报告
  • 原文地址:https://www.cnblogs.com/ideal-20/p/11050176.html
Copyright © 2011-2022 走看看