类篇entry4
关键词: 抽象类; 接口; 抽象类与接口;
抽象类
抽象(abstract)类的概念:用abstract修饰的类称为抽象类,用abstract 修饰的成员方法称为抽象方法。
- 抽象类和具体类的关系就是一般类和特殊类之间的关系,是继承和被继承的关系。
- 抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。只要有一个抽象方法,类前就必须有abstract修饰。若没有抽象方法,类前也可有abstract修饰。
- 抽象类不能创建对象,创建对象由具体子类来实现,但可以有声明,声明能引用所有具体子类的对象。
- 对于抽象方法,在抽象类中只指定方法名及类型,而不写实现代码。抽象类必定要派生子类,若派生的子类是具体类,则具体子类中必须实现抽象类中定义的所有抽象方法(覆盖);若子类还是抽象类,如果父类中已有同名abstract方法,则子类中就不能再有同名的抽象方法了。
- 在抽象类中,非抽象方法可以调用抽象方法。
- abstract不能与final并列修饰同一个类(产生逻辑矛盾);
abstract 不能与private ,static(因为static修饰的方法必然被直
接调用),final或native并列修饰同一个方法;abstract 类中不能
有private成员——这些因为抽象类必然要有子类。
抽象类的产生过程
抽象类形成的思维过程:客观事物—>对象—>类—>抽象类。
抽象类设计注意
- 在设计抽象类的具体子类时,追求它们在实现抽象方法方面所表
现的不同性。例如作为shapes,当s引用矩形时,返回矩形周长
和面积,当引用三角形时,返回三角形周长和面积,当引用圆时
返回圆周长和面积等等。作为抽象类的具体实现者,每个子类必
须给出其周长和面积的具体计算方式。 - 在确定抽象类的抽象方法时,一定要确保这些抽象方法就是同类
对象共同行为的抽取,否则,抽象方法的设计不当,会为继承这
个抽象类的体系带来不利影响。因为抽象类中的任何改动都将关
系到整个类体系的改变,所以抽象类中的信息应尽可能和研究对
象的本质相关。
接口(interface)
接口的两种含义:
- 可以被引用调用的方法(public方法或同包中的protected方法或默认方法);
- 另一种是同“类”概念地位相当的专有概念interface, interface是方法说明的集合。
interface声明格式
[public] interface 接口名[extends 父接口名列表]
{
//静态常量数据成员声明
[public][static][final] 域类型 域名 = 常量值
//抽象方法声明
[public][abstract]返回值 方法名(参数列表)[throw 异常列表]
}
定义接口要注意几点
- 接口定义用关键字interface,而不是用class,interface前的修饰符要么为public,要么为缺省。
- 接口定义的数据成员全是final static(静态常量)。即使没有修饰符,其效果也等效,访问级别要么为public,要么为缺省。
- 接口中没有构造方法;所有成员方法都是抽象方法(与抽象类有所不同)。即使没有修饰符,其效果完全等效,访问级别要么为public,要么为缺省。注:方法前不能修饰为final。
- 接口具有继承性,可通过extends关键字声明接口的父接口。
接口扮演将实现者和使用者有机联系到一起的角色。
接口实现要注意几点
- 在类中,用implements关键字来实现接口。一个类可以实现多个接口,在implements后用逗号隔开多个接口的名字。一个接口也可被多个类来实现。
- 接口的实现者可以继承接口中定义的常量,其效果等效于在这个实现类当中定义了一个静态常量。
- 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致。
- 如果实现接口的类是abstract类,则它可以不实现该接口的所有方法。但对于抽象类的任何一个非抽象的子类而言,接口中的所有抽象方法都必须实现。这些方法体可以来自抽象的父类(被子类继承),也可以来自子类自身的实现,这主要体现了非抽象类中不能存在抽象方法的原则。
- 接口的抽象方法的访问限制符如果为缺省或public时,类在实现方法时,必须显式使用public修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围。
抽象类与接口
visitor tracker