美文网首页
Java 接口

Java 接口

作者: bowen_wu | 来源:发表于2022-05-19 14:11 被阅读0次

    概述

    • 接口不是类
    • 接口只描述有什么功能,不给出具体实现
    • 接口的抽象程度更高
    • 接口可以扩展另外一个接口 => public interface AInterface extends BInterface {} => 自动继承了原先接口的所有的抽象方法
    • 方法默认 public
    • 变量(常量)默认 public static final
    • 接口中的成员只能是 public static final int A = 1; => public + static + final 都是默认
    • 默认方法 => Java 8 之后 abstract 方法可以 default => 接口一旦发布,则不能更改,如果更改,所有使用接口的人都需要更改 => backward compatibility(向后兼容性) => 妥协的产物 => 此时 abstract 方法有函数体 => 同时 implements 两个 interface,这两个 interface 有相同的默认方法 => 二义性 => 编译报错
    class Animals {
    }
    
    // 功能 | 能力
    interface CanFly {
        void canFly();
    }
    
    interface CanBreath {
    }
    
    // 鸟是动物它可以飞
    class Bird extends Animals implements CanFly, CanBreath {
        @Override
        public void canFly() {
            System.out.println("Bird fly");
        }
    }
    

    默认方法优点

    • backward compatibility,为接口添加方法
    • mixin // TODO

    接口 vs 抽象类

    • 描述一种功能的时候,使用接口
    • 需要提供一些实现,使用抽象类

    Java 中的产生接口和抽象类的原因:最大程度的灵活性 + 最大程度的复用

    共同点

    • 抽象的,不可实例化
    • 可以包含抽象方法 => 没有方法体,非 private final static

    不同点

    • 接口不能有实例变量
    • 抽象类是类,可以包含一切类的东西。接口只能包含受限的变量(成员)(public static final)和方法(public)
    • 抽象类只能单一继承。接口可以多继承的,甚至继承多次,最终需要有一个实现(非 default)

    final 关键字

    1. final 声明变量,变量是不可变的,必须初始化(Main 方法中赋值 | 定义时赋值),只能被赋值一次
    2. final 修饰对象时,地址不可以变 => 对象的内部属性 | 方法是可以变的
    3. final 修饰方法 => 禁止 继承 | 覆盖 | 重写 此方法
    4. final 修饰类时意味着这个类不可继承,其他类不可以继承这个类 => 为什么 String | Integer 等类是 final 的 => 避免了客户端通过继承常见的类来破坏程序的约定 =>
      继承提供了灵活性,也埋下了隐患
    5. 可以声明不可变局部变量
    6. 用于声明函数的参数,此时函数的参数不能被改写
    7. static final => 定义有名字的常量

    优点

    • 定义的变量线程是安全的,不用担心多线程带来的问题
    • 保证类 | 方法不被继承,那么将没有人可以通过继承破坏我的具体实现或约定
    • 方法是确定的,没有多态 | 重写,可以把运行时的方法内联起来,提高性能 => // TODO

    知识点

    1. 常量的命名约定 => 全大写 + 下划线
      public static final double PI = 3.1415926;
      private static final double PI = 3.1415926;
      

    相关文章

      网友评论

          本文标题:Java 接口

          本文链接:https://www.haomeiwen.com/subject/mlktprtx.html