抽象类:一个为了被继承而存在的类
public abstract class Market {
public String name;//商场名称
public String goods;//商品名称
public abstract void shop();//抽象方法,用来输出信息
}
【1】使用abstract为关键字修饰的类叫抽象类,不可实例化(不能以此创建对象),只能作为其他类的父类
权限修饰符 abstract
class
类名
{类体}
【2】使用abstract修饰的方法叫抽象方法,没有方法体,必须被子类重写
权限修饰符
abstract
返回值
方法名
()
;
(1)构造方法不能定义为抽象方法
(2)抽象类的子类可以为抽象类
(3)继承抽象类的子类
如果不是抽象类
则
必须
重写抽象类的所有抽象方法
(4)
抽象方法只能被定义在抽象类中
(5)抽象类中可定义普通方法
问题:(1)如果一个抽象类的子类只需要使用抽象类中的一部分方法,但他必须重写抽象类的所有方法(2)如果一个类想用其他两个类的方法,Java单继承机制下,没有办法继承两个类
so
接口:纯粹的抽象类
【1】使用interface关键字进行定义
权限修饰符 interface 接口名
【extends 父接口名】{
【public】 【static】【final】常量
【public】 【abstract】方法
}
(1)权限修饰符只能为public或default
(2)接口中只能为抽象方法
(3)接口中的变量都是static and final的常量,故必须初始化
【2】类使用implements关键字实现接口
class
ParallelogramgleUseInterface
implements
drawTest
{
public
void
draw
() {
// 由于该类实现了接口,所以需要覆盖draw()方法
System
.
out
.
println
(
"平行四边形.draw()"
)
;
}
}
【3】使用
(1)类可以向上转型为父类,抽象父类,所实现的接口
(2)必须实现接口中的所有方法
(3)一个类可以实现多个接口,实现多重继承
public
class
Me
implements
IFather
,
IMather
(4)实现多重继承时可能会出现变量名或方法名冲突,若变量名冲突可用(接口名+.)的方式实现,若方法冲突,只需要实现一个方法
(5)子接口使用extends继承父接口,子类实现子接口时要实现所有子接口与父接口的方法
(6)接口主要使用在类数量较多,继承关系较为复杂的情况下
抽象类与接口的区别:接口是对类的抽象,接口是对行为的抽象,抽象类的功能强于接口,但类只能继承一个类,但能实现多个接口
比较项 |
抽象类
|
接口
|
方法
|
可以有非抽象方法
| 均为抽象方法 |
属性
|
可有非静态常量
|
均为静态常量
|
构造方法
|
有构造方法
|
无构造方法
|
继承
|
只能继承一个类
|
可实现多个接口
|
被继承
|
一个类继承一个类
|
一个接口可继承多个接口
|
(1)子类只能继承一个抽象类,实现多个接口
(2)一个类要实现一个接口必须实现接口中的所有方法,而抽象类不必(所有抽象方法必须被重写,但抽象类中可有一般方法)
(3)抽象类的数据成员可以为各种类型,接口中只能为public static final
一般使用顺序
(1)接口:先对行为进行抽象,定义需要完成的功能
(2)抽象类:提取某些类的相似性
(3)具体类的实现