抽象类与接口是Java语言中对抽象概念进行定义的两种机制,他们让java更加具有强大的面向对象的能力。
抽象类
简单总结
首先,在面向对象的领域一切都是对象。所有的对象都是通过类来描述的,但是并不能说所有的类都是用来描述对象的,比如,抽象类。这样说起来有点晦涩难懂,举个例子吧,
new Animal();我们都知道这是用来产生一个动物对象,但是这个动物Animal对象具体是什么形态的呢?所以他并不具有一个具体的动物概念,所以他就是一个抽象类。
需注意的是:
1、 抽象方法和抽象类都必须使用abstract修饰符来修饰,而且,要记住,抽象方法不能有方法体。
2、 抽象类不能被实例化,无法用new关键字来调用抽象类的构造器创建抽象类的实例。
3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类的构造器不能用于创建实例,主要用于被其子类调用。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、当使用abstract修饰类时,表明这个类只能被继承
7、当使用abstract修饰方法时,表明这个方法必须由子类提供实现(重写)。
8、final修饰的类不能被继承,final实现的方法不能被实现,所以,final和abstract永远不能同时使用。
9、static和abstract不能同时修饰某个方法,也就是说没有什么类抽象方法。
10、abstract关键字修饰的方法必须被其子类重写才有意义,因为他本身永远不会有方法体,所以abstract不能和private同时使用。
抽象类的作用
不难看出,抽象类是从多个具体类中抽象出来的父类,所以既有更高层次的抽象,以它作为其子类的模板,避免子类的随意性。
抽象类体现了数据抽象的思想,是实现多态的一种机制。
接口
简单介绍
使用interface关键字定义接口,接口也不能被实例化,一个接口可以有多个直接父接口,接口只能继承接口,不能继承类。
接口里面的Field只能是常量,方法只能是抽象方法。在接口中,不管是否使用public static final修饰符,接口里的Field总将使用这三个修饰符来修饰。
接口里没有构造器和初始化块,因此接口里定义的Field只能在定义时指定默认值。
接口不能显式的继承任何类,但是所有的接口类型的引用变量都可以直接赋给Object类型的引用变量。因为编译器明白任何java对象都是Object或其子类的实例。
实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。
接口的作用
接口所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法。
接口是抽象类的延伸,一个类可以同时实现多个接口。
通过实现多个接口可以弥补java单继承的不足。
接口和抽象类
接口和抽象类都不能被实例化,都位于继承树的顶端,用于被其他类实现和继承。
接口和抽象类都可以包含抽象方法。
接口里不能定义静态方法,抽象类可以定义静态方法。
抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。
在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据,它的所有方法都是抽象的。
抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。