引用:深入理解Java的接口和抽象类
1.抽象类- 定义:如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。抽象方法必须用abstract关键字进行修饰。抽象类也可以拥有成员变量和普通的成员方法
[public] abstract class ClassName { //抽象类
abstract void fun(); //抽象方法
}
//抽象类的继承
[public] class abstractImpl extends ClassName {
void fun() {
//....
}
}
- 抽象类和普通类的区别
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
(2)抽象类不能用来创建对象
原因:深入Java中的抽象类为何不能实例化?
学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,JAVA不允许抽象类,接口直接实例化。抽象类与接口都不能实例化,继承或实现后就可以实例化了。
(3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
在其他方面,抽象类和普通的类并没有区别
2.接口类- 定义: 接口泛指供别人调用的方法或者函数。 接口是对行为的抽象。
(1) 接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
(2) 允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
//定义形式
[public] interface InterfaceName {
}
//要让一个类遵循某组特地的接口需要使用implements关键字
class ClassName implements Interface1,Interface2,[....]{
}
3.抽象类和接口类区别
| 抽象类 | 接口类 | |
| 方法类型 | 可以提供成员方法的实现细节 | 只能存在public abstract 方法和变量 |
| 变量 | 各种类型 | 只能设定为,或被隐式地指定为public static final变量 |
| 静态代码块以及静态方法 | 可以 | 不能有 |
| 类的继承和实现 | 一个类只能继承一个抽象类; 抽象类可以实现接口的所有方法,也可以一个都不实现。 | 一个类却可以实现多个接口 |
| 设计层面 | 对整个类整体进行抽象,包括属性、行为 e.g抽象类airplane(战斗机,客机等子类实现抽象类airplane) | 对行为的抽象 e.g接口类飞行存在方法fly()(抽象类Airplane和Bird分别根据自己的需要实现Fly这个接口) |
| 变更 | 抽象类追加具体的类的实现,子类可以不用修改 | 接口类进行了变更,每一个子类都需要对应变更 |
如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。(抽象类bird实现了飞行类,bird子类鸵鸟可以不实现飞行类中的fly()方法)
参考:java抽象类实现接口



