在使用上,一个不包含非抽象方法的抽象类与接口是类似的,不过请注意以下几点
1:一个类可以实现任意多个接口,但它最多只能继承一个抽象类
2:一个抽象类可以含有诺干个非抽象方法,它通常是模板方法模式的一个实例.而一个接口的所有方法都是抽象的,无论是否将它的方法显示地声明为抽象.
3:一个抽象类可以声明实例变量,其子类可以继承这些实例变量.而一个接口不能声明实例变量,不过接口可以声明static final修饰的域。
4:一个抽象类可以定义构造方法,而接口不能。
5:一个抽象类的可见性修饰符可以是public,protected,private,或者无修饰符(表示包内可见);而一个接口的可见性修饰符只能是public,或者无修饰符(表示包内可见)
6:一个抽象类的方法的可见性修饰符可以是protected,private,或者无修饰符(表示包内可见);
而一个接口的方法的可见性修饰符只能是public.
7:一个抽象类是从Object类派生而来的,它继承了Object类的clone()方法和equals()方法。
例:
package com.oozinoz.simulation;
import com.oozinoz.units.*;
interface RocketSim()
{
abstract Length appgee();
public Force thrust();
}
下面的表述正确的是?
A: RocketSim接口中的两个方法都是抽象方法,尽管只有apogee()方法显式地声明为抽象的
正确,接口的方法总是抽象的,无论是否显式地声明
B: RocketSim接口中的两个方法都是公共方法,尽管只有thrust()方法显式地声明为公共的
正确,接口的方法总是公共的,无论是否显式地声明。
C: 所有接口都是公共的,所以RocketSim也是公共的,尽管它没有显式地声明为公共的
错误,该接口的可见性受限于其所在的包,RocketSim接口没有显式地声明为public,因而它在包内可见,com.oozinoz.sim包之外的其他类是无法访问或实现该接口的。
D: 可以再创建一个接口,如RocketSimSolid接口,并扩张RocketSim接口。
正确,例如,List接口和Set接口都扩展了java.util包中的Collection接口。
E: 每个接口必须至少含有一个方法
错误,不含方法的接口被称作标记(market)接口
F:接口可以声明实例域,实现该接口的类,也必须声明该域。
错误,一个接口不能声明实例域,不过它可以通过声明static和final修饰的域来声明常量
G:虽然不能实例化一个接口,但接口定义可以声明构造器方法,要求实现该接口的类必须提供具有指定参数的构造器的方法。
错误,接口不可以定义构造方法