提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、面向抽象编程是什么?
二、Before面向抽象编程
为了编写一个圆柱体类,首先编写了圆类。
2.After面向抽象编程
总结
前言
巩固学习JAVA基础,了解所谓面向抽象编程思想
一、面向抽象编程是什么?
面向抽象编程实际上是灵活使用多态的方式,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。(tips:上转型对象,即父类或被继承的接口所声明的对象被子类的初始化或面向该接口的类的初始化)有些抽象,我们接下来举一些例子。
二、Before面向抽象编程
为了编写一个圆柱体类,首先编写了圆类。
Circle类:
public class Circle {
double r;
Circle(double r){
this.r=r;
}
public double getArea(){
return (3.14*r*r);
}
}
Pillar类:
public class Pillar {
Circle bottom;
double height;
Pillar(Circle bottom,double height){
this.height = height;
this.bottom = bottom;
}
public double getVolum(){
return bottom.getArea()*height;
}
}
观察上面的两个类,不难看出Pillar类中构造函数使用了Circle类对象,这一操作使得两个类结构分明,易于调试。但缺点也很明显,如果想要修改需求,比如柱体Pillar此时从圆柱换成三角柱体,此时Circle类中的getArea()直接报废需要重写。
为了应对这种情况,我们将面相抽象重新设计Pillar类,首先编写一个抽象类Geometry,该抽象类中定义了一个抽象的getArea(),
2.After面向抽象编程
在编写具体的底前我们需要抽象出底的概念,并将其行为概括进其实例方法中:
Geometry:
public abstract class Geometry {
public abstract double getArea();
}
接下来是,会用到该概念的实例,例如需要用到底面的柱体:
Pillar:
public class Pillar {
/*
该代码段为未使用面向抽象编程后
*/
Geometry bottom;
double height;
Pillar(Geometry bottom, double height){
this.bottom = bottom;
this.height=height;
}
public double getArea(){
if(bottom==null){
System.out.println("该柱体没有底,无法计算面积");
return -1;
}
return bottom.getArea()*height;
}
}
此时,我们已经完成了一个柱体生成器,当然底面的实例还未实现,此时体现了面向抽象编程的优越性,我们可以无限添加具体的底面类,并且不用修改柱体类的实现:
Circle:
public class Circle extends Geometry {
double r;
Circle(double r){
this.r=r;
}
@Override
public double getArea() {
return (3.14*r*r);
}
}
Rectangle:
public class Rectangle extends Geometry{
double a,b;
Rectangle(double a,double b){
this.a=a;
this.b=b;
}
@Override
public double getArea() {
return a*b;
}
}
总结
面向抽象编程体现了面向对象编程的优越性,通过抽象类和其实现类的关系,使得使用抽象类方法的其他类可以在不修改自身的情况下,修改抽象类的实现类以达到扩充的目的,也满足OCP原则