抽象类
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类
接口
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法
抽象类 | 接口 | |
定义 | abstract class Xxx | interface Xx |
使用 | extends | implements |
构造器 | 可以有构造器 | 不能 |
除不能实例化外其他与普通java class类相同 | 完全不同 | |
修饰符 | 修饰符都可 | 只能是public 默认是public |
实现 | 可选择重写 | 接口中方法器实现类必须存在 |
常量 | 定义常量 public static final | 默认就是,直接类型名 变量名即可 |
什么时候使用抽象类和接口
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
- 如果你想实现多重继承,那么你必须使用接口
- 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
要把对象的行为和对象的实现分离开来
行为模型应该总是通过接口而不是抽象类定义
在使用接口的同时仍旧可以使用抽象类,不过这时抽象类的作用是实现行为,而不是定义行为。只要实现行为的类遵从接口定义,即使它改变了父抽象类,也不用改变其它代码与之交互的方式。特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。
1. 接口中的方法可以有参数列表和返回类型,但不能有任何方法体。
2. 接口中可以包含字段,但是会被隐式的声明为static和final。
3. 接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。
4. 如果没有实现接口中所有方法,那么创建的仍然是一个接口。
5. 扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。
附:
常量定义举例:
class:
public final class Constants {
private Constants() {}
public static final int A = 100;
public static final int B = 100;
public static final int C = 100;
public static final int D = 100;
}
类定义常量,需要定义成final且定义一个private的构造方法,这样做是为了不让其他类继承,禁止实例化此类,调用时直接以"类.常量"的方式调用
不能实例化也不能被继承,看起来完美无缺。
---------------------------------
interface:
public interface Constants {
int A = 100;
int B = 100;
int C = 100;
int D = 100;
}
接口定义常量,虽不能实例化,却可以被其他类实现。
interface生成的class文件比class生成的class文件会更小,而且更简洁,效率更高。