Java编程那些事儿68——抽象类和接口(一)
副标题#e#
在实际的项目中,整个项目标代码一般可以分为布局代码和逻辑的代码。就像制作衡宇时,需要首先搭建整个衡宇的布局,然后再细化衡宇相关的其它的布局,也像制造汽车时,需要首先建造汽车的框架,然后才是安装配件以及美化等事情。措施项目标实现也遵循同样的原理。
在项目设计时,一个根基的原则就是——“设计和实现相疏散”。也就是说布局代码和逻辑代码的疏散,就像设计汽车时只需要存眷汽车的相关参数,而不必过于体贴如何实现这些要求的建造。措施设计时也是首先设计项目标布局,而不消过多的干系每个逻辑的代码如何举办实现。
前面先容的流程节制常识,主要办理的是逻辑的代码的编写,而类和工具的常识,则主要办理布局代码的编写。那么尚有一个主要的问题:如何设计布局代码呢?这就需要利用下面先容的抽象类和接口的常识了。
8.9.1 抽象类
抽象类(Abstract Class)是指利用abstract要害字修饰的类,也就是在声明一个类时插手了abstract要害字。抽象类是一种非凡的类,其它未利用abstract要害字修饰的类一般称作实体类。譬喻:
public abstract class A{
public A(){}
}
抽象要领(Abstract Method)是指利用abstract要害字修饰的要领。抽象要领是一种非凡的要领,其它未利用abstract要害字修饰的要领一般称作实体要领。
public abstract void test();
抽象类和实体类对比,主要有以下两点差异:
l 抽象类不能利用自身的结构要领建设工具(语法不答允)
譬喻下面的语法是错误的:
A a = new A();
可是抽象类可以声明工具,譬喻下面的代码是正确的:
A a;
A a1,a2;
只是声明出的工具默认都是null的,无法挪用其内部的非静态属性和非静态要领。
说明:抽象类可以利用子类的结构要领建设工具。
l 抽象类内部可以包括任意个(0个、1个或多个)抽象要领
抽象类内部可以包括抽象要领,也可以不包括抽象要领,对付包括的个数没有限制。而实体类内部不能包括抽象要领。
在抽象类内部,可以和实体类一样,包括结构要领、属性和实体要领,这点和一般的类一样。
#p#副标题#e#
抽象要领和实体要领对比,主要有以下几点差异:
l 抽象要领没有要领体
也就是说在声明抽象要领时,不能书写要领体的{},而只能以分号竣事要领。下面是实体要领和抽象要领声明的较量:
抽象要领声明:
public abstract void test(int a);
实体要领声明:
public void test(int a){
要领体
}
l 抽象要领地址的类必需为抽象类
也就是说,假如抽象要领声明在一个类内部,则该类必需为抽象类。(说明:抽象要领也可以呈此刻接口内部,这个将在后续举办先容)。
这样,在担任时,假如担任的类是抽象类,而该抽象类中还包括抽象要领时,则该子类必需声明成抽象类,不然将呈现语法错误。假如子类需要做成实体类的话,则必需包围担任的所有抽象要领。这个是抽象类最焦点的语法成果——强制子类包围某些要领。
先容了这么多抽象类和抽象要领的常识今后,那么抽象类有什么用途呢?
抽象类的用途主要有两个:
l 严禁直接建设该类的工具
假如一个类内部包括的所有要领都是static要领,那么为了制止其它措施员误用,则可以将该类声明为abstract,这样其它措施员只能利用类名.要领名挪用对应要领,而不能利用工具名.要领名举办挪用。这样的类譬喻API中的Math类
说明:共同final要害字利用,将必需该类被担任,这样将得到越发完美的结果。
l 强制子类包围抽象要领
这样可以使所有的子类在要领声明上保持一致,在逻辑上也必需将要领的成果保持一致。譬喻游戏中设计类时,设计了怪物类以及相关的子类,每个怪物类都有移动要领,可是每种怪物的移动法则又不沟通,这样通过使每个怪物类的移动要领的声明保持一致,利便挪用。可以参看前面多态部门的先容得到更多的关于挪用统一常识。
这是抽象类最主要的用途。就像现实社会中,各类银行网点保持统一的装修气势气魄,各类快餐店(肯德基、麦当劳等)保持统一的装修甚至风味,这样便于糊口中的识别。通过让存在担任干系的类中成果一样(可是内部实现法则差异)的要领声明成一样的,利便多态的利用。
那么什么时候在设计时利用抽象类呢?这个问题参看一下抽象类的用途自然就知道了。关于抽象类的常识先先容这么多,下面先容接口的常识,最终将对抽象类和接口举办一下较量。