1.抽象类:用关键字abstract修饰的类称为抽象类。
抽象类的特点:
(1)抽象类中可以有抽象方法;若一个类中有抽象方法则该类必须为抽象类。
与普通类相比,抽象类可以有抽象方法(abstract方法),也可以有非抽象方法。对于抽象类,只允许声明,不允许实现,而且不允许使用final和abstract同时修饰一个方法。下面的A类中的min方法是抽象方法:
abstract class A{
abstract int min(int x,int y);
int max(int x,int y){
return x>y?x:y;
}
}
(2)抽象类不能用创建对象。
如果一个非抽象类是某一个抽象类的子类,那么它必须重写父类的抽象方法。这就是为什么不允许使用final和abstract同时修饰一个方法的原因。
(3)做上转型
尽管抽象类不能创建对象,但它的非抽象子类必须重写其中的全部抽象方法,这样一来,就可以让抽象类声明的对象称为其子类对象的上转型对象,并调用子类重写的方法。
注:抽象方法一定存在抽象类中,但抽象类中不一定有抽象方法。
2.接口:关键字interface用来定义一个接口。
(1)接口声明
我们曾经用class来声明一个类,接口通过使用关键字interface来声明。
interface接口的名字
(2)接口体
接口体中包含常量定义和方法定义两部分。接口体中只进行方法的声明,不允许提供方法的实现,所以方法的定义没有方法体。例如:
interface Printable{ final int MAX=100; void add(); float sum(float x,floaty); }
(3)接口的使用
一个类通过使用关键字implements声明自己实现一个或多个接口,用逗号隔开接口名,如:
class A implements Printable,Addable
类A使用接口Printable和接口Addable。如果一个类实现某个接口,那么这个类就必须实现该接口的所有方法,即为这些方法提供方法体。
注:
①接口中的方法默认是public和abstract,接口在声明方法时可以省略方法前面的关键字public和abstract,但是在实现接口方法时,一定要用public来修饰。
②如果父类实现某个接口,那么子类也就自然实现了该接口,子类不必在显示地使用关键字implements声明自己实现这个接口。
③接口也可以被继承,既可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
(4)接口的本质:
①接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
例如,在自然界中,人都能吃饭,即“如果你是人,则必须能吃饭”。那么模拟到计算机程序中,就应该有一个IPerson(习惯上,接口名由“I”开头)接口,并有一个方法叫Eat(),然后我们规定,每一个表示“人”的类,必须实现IPerson接口,这就模拟了自然界“如果你是人,则必须能吃饭”这条规则。
②接口是在一定粒度视图上同类事物的抽象表示。注意这里我强调了在一定粒度视图上,因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。例如,在我的眼里,我是一个人,和一头猪有本质区别,我可以接受我和我同学是同类这个说法,但绝不能接受我和一头猪是同类。但是,如果在一个动物学家眼里,我和猪应该是同类,因为我们都是动物,他可以认为“人”和“猪”都实现了IAnimal这个接口,而他在研究动物行为时,不会把我和猪分开对待,而会从“动物”这个较大的粒度上研究,但他会认为我和一棵树有本质区别。
3.接口回调
(1)接口回调
可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。
(2)接口作为参数
当一个方法的接口是一个接口类型时,如果一个类实现了该接口,那么就可以把该类的实例的引用传值给该参数,参数可以回调类实现的接口方法。
(3)上转型与接口回调的区别
使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型。
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能。而向上转型则牵涉到多态和运行期绑定的范畴。
4.面向接口
(1)面向接口的意思是指在面向对象的系统中所有的类或者模块之间的交互是由接口完成的。
(2)面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
(3)“开-闭原理”,即对扩展开放,对修改关闭。
5.抽象类和接口的比较
抽象类和接口的区别:
(1)接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。
(2)抽象类和接口都可以有抽象方法。
(3)接口只可以有常量,不能有变量;而抽象类中既可以有常量也可以有变量。
(4)抽象类中可以有非抽象方法,而接口不可以。
(5)抽象类里可以有构造方法,而接口内不能有构造方法。
(6)抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
(7)抽象类中可以包含静态方法,接口内不能包含静态方法。
(8)抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
(9)一个类可以实现多个接口,但只能继承一个抽象类。
(10)接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。
选择使用接口和抽象类的依据
不相关的对象具有相同的行为用接口;存在明显的继承关系时用抽象类。