1 抽象类
在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点有:
- 抽象类是用来捕捉子类的通用特性的,它不能被实例化,只能被继承
- 包含抽象方法的一定是抽象类,但抽象类不一定含有抽象方法
- 抽象类中的抽象方法只能为public或protected(如果是private则不能被子类继承),默认为public
- 抽象类中的抽象方法只有方法体,没有具体实现
- 如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类
- 抽象类可以包含属性、方法、构造方法等,但是构造方法不能用于实例化,主要用途是被子类调用。
2 接口
Java中的接口使用interface关键字修饰,接口是方法的集合。接口中可以含有 变量和方法,但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
2.1 接口的特点
1、接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前); 2、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题; 3、一个类可以实现多个接口; 4、JDK1.8中对接口增加了新的特性: 4.1、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法; 4.2、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
3 抽象类和接口的共同点和区别
3.1 共同点
- 都不能被实例化
- 都可以包含抽象方法
- 都可以有默认实现的方法(Java 8 可以用 default 关键在接口中定义默认方法)
3.2 区别
- 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系(比如说我们抽象了一个发送短信的抽象类,)。
- 一个类只能继承一个类,但是可以实现多个接口(如果想实现多继承就用接口)。
- 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
4 抽象类和接口的应用场景
1、如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。 2、如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。 3、如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
|