final关键字
final 表示不可改变的含义
- 采用 final 修饰的类不能被继承
- 采用 final 修饰的方法不能被覆盖
- 采用 final 修饰的变量不能被修改
- final 修饰的变量必须显示初始化
- 如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值,但被指向的对象是可以修改的
- 构造方法不能被 final 修饰
- 会影响 JAVA类的初始化:final 定义的静态常量调用时不会执行 java 的类初始化方法,也就是说不会执行 static 代码块等相关语句,这是由 java 虚拟机规定的。我们不需要了解的很深,有个概念就可以了。
注:用public static final修饰的变量是常量
抽象类
在 java 中采用 abstract 关键字定义的类就是抽象类,采用 abstract 关键字定义的方法就是抽象方法
特点
- 抽象的方法只需在抽象类中,提供声明,不需要实现。起到了一个强制的约束作用,要求子类必须实现。也就是说子类继承抽象类,要实现抽象方法。
- 如果一个类中含有抽象方法,那么这个类必须定义成抽象类
- 如果这个类是抽象的,那么这个类被子类继承,抽象方法必须被重写。如果在子类中不复写该抽象方法,那么必须将此类再次声明为抽象类
- 抽象的类是不能实例化的。
- 抽象类不能被 final 修饰 ,因为final修饰的类不可以继承,而抽象类主要是来给子类继承的。
- 抽象方法不能被 final 修饰,因为抽象方法就是被子类实现的,而final修饰的方法不可以覆盖。
接口
接口我们可以看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和常量
特点
1) 在 java 中接口采用 interface 声明
2) 接口中的方法默认都是 public abstract 的,不能更改 ,接口中的方法默认有public abstract,所以可以省略。
3) 接口中的变量默认都是 public static final 类型的,不能更改,所以必须显示的初始化 。接口中的变量默认加入 public static final 所以可以省略不写。
4) 接口不能被实例化,接口中没有构造函数的概念
5) 接口之间可以继承,但接口之间不能实现
6) 接口中的方法只能通过类来实现,通过implements 关键字
7) 如果一个类实现了接口,那么必须实现接口中的所有方法(因为抽象类、抽象方法就是用来实现的。)
8) 一类可以实现多个接口
作用/应用
- 采用接口明确的声明了它所能提供的服务
- 解决了 Java 单继承的问题
- 实现了可接插性(重要)——可插拔性
- 提高程序的扩展性,更好的适应需求
接口和抽象类的区别
a) 接口描述了方法的特征,不给出实现,一方面解决 java 的单继承问题,实现了强大的可接插性
b) 抽象类提供了部分实现,抽象类是不能实例化的,抽象类的存在主要是可以把公共的代码移植到抽象类中
所以要尽量面向接口或者面向抽象编程,而不要面向具体编程。
程序优先选择接口,因为类和接口可以多实现,而类和抽象类只能单继承。