概述
- 接口不是类
- 接口只描述有什么功能,不给出具体实现
- 接口的抽象程度更高
- 接口可以扩展另外一个接口 =>
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
关键字
-
final
声明变量,变量是不可变的,必须初始化(Main
方法中赋值 | 定义时赋值),只能被赋值一次 -
final
修饰对象时,地址不可以变 => 对象的内部属性 | 方法是可以变的 -
final
修饰方法 => 禁止 继承 | 覆盖 | 重写 此方法 -
final
修饰类时意味着这个类不可继承,其他类不可以继承这个类 => 为什么String
|Integer
等类是final
的 => 避免了客户端通过继承常见的类来破坏程序的约定 =>
继承提供了灵活性,也埋下了隐患 - 可以声明不可变局部变量
- 用于声明函数的参数,此时函数的参数不能被改写
-
static final
=> 定义有名字的常量
优点
- 定义的变量线程是安全的,不用担心多线程带来的问题
- 保证类 | 方法不被继承,那么将没有人可以通过继承破坏我的具体实现或约定
- 方法是确定的,没有多态 | 重写,可以把运行时的方法内联起来,提高性能 => // TODO
知识点
- 常量的命名约定 => 全大写 + 下划线
public static final double PI = 3.1415926; private static final double PI = 3.1415926;
网友评论