抽象类于接口
前面我们介绍了继承,子类继承父类 的非私有成员,在java中还可以创建专门的类座位父类,这种类被称为抽象类,抽象类有点像模板,他只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法,比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢
于是我们有了抽象类的定义
抽象类定义的格式:
abstract class 类名 {
}
//研发部员工 abstract class Developer { public abstract void work();//抽象函数。需要abstract修饰,并分号;结束 } //JavaEE工程师 class JavaEE extends Developer{ public void work() { System.out.println("正在研发淘宝网站"); } } //Android工程师 class Android extends Developer { public void work() { System.out.println("正在研发淘宝手机客户端软件"); } }
这就是一个抽象类,有两个子类继承了她
抽象类的特点:
1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。
之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。
抽象类就先说这么多,接下来我们看一下接口
接口
可以把接口看作是抽象类的一个分支,接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
与定义类的class不同,接口定义时需要使用interface关键字。并且一个接口可以继承多个父类
interface Fu1{ void show(); } interface Fu2{ void show1(); } interface Fu3{ void show2(); } interface Zi extends Fu1,Fu2,Fu3{ void show3(); }
这里可以使用extends关键字
class Fu { public void show(){} } interface Inter { pulbic abstract void show1(); } class Zi extends Fu implements Inter { public void show1() { } }
这里继承一个接口,所以要用关键字implements,并且父类也是接口类型
好了,我们来具体看一下抽象类和接口的区别
相同点:
1都位于继承的顶端,用于被其他类实现或继承;
2都不能直接实例化对象;
3都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
1抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
2一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
3抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系
4接口是这个事物中的额外内容,继承体系是一种 like..a关系
二者的选用:
1 优先选用接口,尽量少用抽象类;
2需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
好了,接口和抽象类就介绍到这里