第4节 抽象类
7.4 抽象类
抽象类
代表一个抽象概念的类
没有具体实例对象的类,不能使用new方法进行实例化
类前需加修饰符abstract可包含常规类能够包含的任何东西,例如构造方法,非抽象方法
也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现
7.4 抽象类——存在意义
存在意义
抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化的特征
抽象类中可以包括被它的所有子类共享的公共行为
抽象类可以包括被它的所有子类共享的公共属性
在程序中不能用抽象类作为模板来创建对象;
在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性
7.4 抽象类——几何形状的例子
将所有图形的公共属性及方法抽象到抽象类Shape。再将2D及3D对象的特性分别抽取出来,形成两个抽象类TwoDimensionalShape及ThreeDimensionalShape
2D图形包括Circles、Triangles、Rectangles和Squares
3D图形包括Cube、Sphere、或Tetrahedron
在UML中,抽象类的类名为斜体,以与具体类相区别

7.4 抽象类——人员的例子
例4-6中,如果在应用系统中涉及到的人员只包括:Customers,Employees 及 Managers。则Person 类的子类对象覆盖了应用中的对象,可以将Person 类声明为抽象类

7.4.1 抽象类的声明
抽象类声明的语法形式为
abstract class Number { . . .}
如果写: new Number();
编译器将显示错误
7.4.2 抽象方法
抽象方法
声明的语法形式为
public abstract <returnType> <methodName>(...);
仅有方法头,而没有方法体和操作实现
具体实现由当前类的不同子类在它们各自的类声明中完成
抽象类可以包含抽象方法
7.4.2 抽象方法——需注意的问题
需注意的问题
一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体,即重写父类中的所有抽象方法
只有抽象类才能具有抽象方法,即如果一个类中含有抽象方法,则必须将这个类声明为抽象类
除了抽象方法,抽象类中还可以包括非抽象方法
7.4.2 抽象方法——优点
抽象方法的优点
隐藏具体的细节信息,使调用该方法的程序不必过分关注该类和它的各子类的内部状况。所有的子类使用的都是相同的方法头,而方法头里实际包含了调用该方法的程序语句需要了解的全部信息
强迫子类完成指定的行为,抽象类的所有非抽象子类都必须完成其父类中声明的抽象方法,抽象类通常声明抽象方法规定其子类需要用到的“标准”行为
7.4.2 抽象方法——一个绘图的例子

各种图形都需要实现绘图方法,可在它们的抽象父类中声明一个draw抽象方法
abstract class GraphicObject {int x, y;
void moveTo(int newX, int newY) { . . . }
abstract void draw();}
7.4.2 抽象方法——一个绘图的例子
然后在每一个子类中重写draw方法,例如:
class Circle extends GraphicObject {void draw() { . . . }}
class Rectangle extends GraphicObject
{void draw() { . . . }}
7.4.2 抽象方法——例7_11

贷款(Loan)分为许多种类,如租借(Lease)、抵押(Mortgage)、房屋贷款(HouseLoan)、汽车贷款(CarLoan)等
将Loan声明为抽象类,并指定所有的子类对象都应具有的行为,如计算月还款值(calculateMonthlyPayment),还款(makePayment),取得客户信息(getClientInfo),其中前两个因贷款种类不同计算方法也不同,可声明为抽象方法,Loan的所有子类都必须对这两个抽象方法进行重写
public abstract class Loan { public abstract float calculateMonthlyPayment();
public abstract void makePayment(float amount);
public Client getClientInfo() { } }
抽象类
代表一个抽象概念的类
没有具体实例对象的类,不能使用new方法进行实例化
类前需加修饰符abstract可包含常规类能够包含的任何东西,例如构造方法,非抽象方法
也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现
7.4 抽象类——存在意义
存在意义
抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化的特征
抽象类中可以包括被它的所有子类共享的公共行为
抽象类可以包括被它的所有子类共享的公共属性
在程序中不能用抽象类作为模板来创建对象;
在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性
7.4 抽象类——几何形状的例子
将所有图形的公共属性及方法抽象到抽象类Shape。再将2D及3D对象的特性分别抽取出来,形成两个抽象类TwoDimensionalShape及ThreeDimensionalShape
2D图形包括Circles、Triangles、Rectangles和Squares
3D图形包括Cube、Sphere、或Tetrahedron
在UML中,抽象类的类名为斜体,以与具体类相区别

7.4 抽象类——人员的例子
例4-6中,如果在应用系统中涉及到的人员只包括:Customers,Employees 及 Managers。则Person 类的子类对象覆盖了应用中的对象,可以将Person 类声明为抽象类

抽象类声明的语法形式为
abstract class Number { . . .}
如果写: new Number();
编译器将显示错误
7.4.2 抽象方法
抽象方法
声明的语法形式为
public abstract <returnType> <methodName>(...);
仅有方法头,而没有方法体和操作实现
具体实现由当前类的不同子类在它们各自的类声明中完成
抽象类可以包含抽象方法
7.4.2 抽象方法——需注意的问题
需注意的问题
一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体,即重写父类中的所有抽象方法
只有抽象类才能具有抽象方法,即如果一个类中含有抽象方法,则必须将这个类声明为抽象类
除了抽象方法,抽象类中还可以包括非抽象方法
7.4.2 抽象方法——优点
抽象方法的优点
隐藏具体的细节信息,使调用该方法的程序不必过分关注该类和它的各子类的内部状况。所有的子类使用的都是相同的方法头,而方法头里实际包含了调用该方法的程序语句需要了解的全部信息
强迫子类完成指定的行为,抽象类的所有非抽象子类都必须完成其父类中声明的抽象方法,抽象类通常声明抽象方法规定其子类需要用到的“标准”行为
7.4.2 抽象方法——一个绘图的例子

各种图形都需要实现绘图方法,可在它们的抽象父类中声明一个draw抽象方法
abstract class GraphicObject {int x, y;
void moveTo(int newX, int newY) { . . . }
abstract void draw();}
7.4.2 抽象方法——一个绘图的例子
然后在每一个子类中重写draw方法,例如:
class Circle extends GraphicObject {void draw() { . . . }}
class Rectangle extends GraphicObject
{void draw() { . . . }}
7.4.2 抽象方法——例7_11

贷款(Loan)分为许多种类,如租借(Lease)、抵押(Mortgage)、房屋贷款(HouseLoan)、汽车贷款(CarLoan)等
将Loan声明为抽象类,并指定所有的子类对象都应具有的行为,如计算月还款值(calculateMonthlyPayment),还款(makePayment),取得客户信息(getClientInfo),其中前两个因贷款种类不同计算方法也不同,可声明为抽象方法,Loan的所有子类都必须对这两个抽象方法进行重写
public abstract class Loan { public abstract float calculateMonthlyPayment();
public abstract void makePayment(float amount);
public Client getClientInfo() { } }



