一、abstract抽象类
一个类中没有包含足够的信息来描绘一个具体的对象
- 不能实例化对象,必须被继承才能被使用
- 抽象类表示了一种继承关系,一个类只能继承一个抽象类,却可以实现多个接口
(一)抽象方法 public protected 无private
只包含一个方法名,而没有方法体;在父类中证明为abstract方法,子类中来具体实现
- 如果一个类中包含抽象方法,那么该类必须是抽象类
- 任何子类必须重写父类的抽象方法,或声明自身为抽象类(否则,从最初的父类到最终的子类都不能用来实例化对象)
(二)总结规定
- 抽象类不能被实例化,编译无法通过
- 有抽象方法的类必定是抽象类,反之不一定
- 抽象类中的抽象方法仅声明,不含方法体(无具体实现)
- 抽象类中的抽象方法的子类(非抽象类的)必须实现该抽象方法
- 构造方法、类方法(static修饰的方法)不能声明为抽象方法
二、Java接口
一个抽象类型,是抽象方法的集合
一个类通过继承接口的方式,从而来继承接口的抽象方法
- 类描述对象的属性和方法,接口则包含类要实现的方法
- 实现接口的类,要么是抽象类,要么必须实现接口内所有的方法
- 接口无法被实例化,但是可以被实现
- 接口类型可以用来声明一个变量,成为一个空指针,或被绑定在一个以此接口实现的对象
(一)接口特性
- 接口中每一个方法也是隐式抽象的,方法被指定为
public abstract
(其他修饰符会报错) - 接口中可以含有变量,变量被隐式指定为
public static final
变量(其他修饰符会报错) - 接口中方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法
(二)接口与类的区别
- 接口不能用于实例化对象
- 接口没有构造方法
- 接口中所有的方法必须是抽象方法
- 接口不能包含成员变量,除了static和final变量
- 接口不是被类继承了,而是要被类实现
- 接口支持多继承
注:类在实现接口的方法时,不能抛出强制性异常,仅能在接口中,或继承接口的抽象类中抛出该强制性异常
三、Interface与abstract类的区别
- abstract class在Java中表示的是一种继承关系,一个类只能使用一次继承关系;但是一个类可以实现多个interface
- abstract class中可以有自己的数据成员,也可以有非abstract的方法;而在interface中,只能够有静态的不能被修改的数据成员(即必须是
static final
的,不过在interface中一般不定义数据成员),所有的方法都是public abstract
的 - abstract class中的变量默认是friendly型,其值可以在子类中重新定义,也可以重新赋值;接口中定义的变量默认是
public static final
型,且必须给其赋值,所以实现类中不能重新定义,也不能改变其值 - abstract class和interface所反映出的设计理念不同,abstract class表示的是
“is-a”
关系,interface表示的是“like-a”
关系,门和报警的关系 - 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法,接口中则不能有实现方法
注:abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系