抽象类


笔者这是第三次来看这本java程序设计语言基础篇,以前看的时候没有敲过相关的代码,直到在工作室待了一年后,又重新把本书看了一遍,对里面一些精华的部分,有了更深的理解。比如抽象类,相信许多初学的小伙伴对此很不理解,接下来,我就对这部分内容做一个总结~

抽象类:
在继承的层次结构中,随着每个新的子类的出现,类会变得越来 越明确和具体。如果从一个子类追溯到父类,类就会变得更加不明确和具体。类的设计应该确保父类包含他的子类的共同特征。有时候,一个父类设计的非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。 同样的,有些方法的实现取决于具体的对象,这样的方法也称为抽象方法。抽象类和抽象方法都需要用修饰符abstract表示~~~

抽象类和常规类很像,但是不能使用new操作符创建他的实例。抽象方法只有定义而没有实现。他的实现由子类提供。一个包含抽象方法的类必须声明为抽象类,而抽象类中可以包含非抽象方法。
抽象类的构造方法定义为protected,因为它只能被子类调用。创建一个具体的子类实例时,它的父类的构造方法被调用以初始化父类中定义的数据。

为什么要用抽象类?
以一个例子来形象的说明一下,首先创建了一个几何的抽象父类,里面包含了共有的一些属性,比如:背景的颜色,是否填充,以及创建的时间。然后用两个子类来实现她,一个圆和一个矩形,在原来父类的原有的属性中,又增加了自己的属性调。
用equalArea方法来检查他们的面积是否形同,然后调用displayGeometricObject方法来显示他们。

/**
 * 抽象类的定义
 * Created by 郑文华 on 2017/6/7.
 */
public abstract class GeometricObject {
    //定义背景的颜色
    private  String color = "white";
    //是否填充
    private boolean filled ;
    //创建的日期
    private java.util.Date  dateCreated;

    //构造方法
    protected  GeometricObject(){
        dateCreated = new java.util.Date();
    }

    //有参数的构造方法
    protected GeometricObject(String color, boolean filled){
        dateCreated = new java.util.Date();
        this.color = color;
        this.filled = filled;

    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public boolean isFilled() {
        return filled;
    }

    public void setFilled(boolean filled) {
        this.filled = filled;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    //重写toString方法
    public String toString(){
        return  "created on " + dateCreated + "\ncolor" + color + "and filled " + filled;

    }

    //抽象方法获取面积
    public abstract double getArea();

    //抽象方法获得周长
    public abstract double getPerimeter();

}
/**
 * 具体的几何对象 圆
 * Created by 郑文华 on 2017/6/7.
 */
public class Circle extends GeometricObject {
    //定义自己的专有属性半径
    private double radius;

   public Circle(){

    }

    public Circle(double radius){
       this.radius = radius;

    }

    public Circle(double radius, String color, boolean filled){
        this.radius = radius;
        setColor(color);
        setFilled(filled);
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    //实现父类的抽象方法
    public double getArea(){
        return radius * radius * Math.PI;
    }

    public double getDiameter(){
        return 2 * radius;
    }
    //实现父类的抽象方法
    public double getPerimeter(){
        return 2 * radius * Math.PI;
    }
}
/**
 * 具体的几何对象   矩形
 * Created by 郑文华 on 2017/6/7.
 */
public class Rectangle extends GeometricObject {
    //定义自己的专有属性 宽
    private double width;
    //定义自己的专有属性 高
    private double height;

    public Rectangle(){

    }

    public Rectangle(double width, double height){
        this.height = height;
        this.width = width;
    }

    public Rectangle(double width, double height, String color, boolean filled){
        this.width = width;
        this.height = height;
        setColor(color);
        setFilled(filled);
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
   //实现父类的抽象方法 获得面积
    public double getArea(){
        return width * height;
    }
    //实现父类的抽象方法 获得周长
    public double getPerimeter(){
        return 2 * (width + height);
    }
}
/**
 * 测试的方法
 * Created by 郑文华 on 2017/6/6.
 */


public class TestGeometricObject {
    public static void main(String[] args){
        GeometricObject  geoObject1 = new Circle(5);
        GeometricObject  geoObject2 = new Rectangle(5,3);

        System.out.println("The two objects have the same area ? " + equalArea(geoObject1,geoObject2));

        //打印出geoObject1的信息
        dispalyGeometricObject(geoObject1);
        //打印出geoObject2的信息
        dispalyGeometricObject(geoObject2);

    }
    public static boolean equalArea(GeometricObject object1, GeometricObject object2){
        return object1.getArea() == object2.getArea();
    }

    public static void dispalyGeometricObject(GeometricObject object){
        System.out.println();
        System.out.println("The area is " + object.getArea());
        System.out.println("The perimeter is" + object.getPerimeter());
    }
}


输出的结果:

The two objects have the same area ? false

The area is 78.53981633974483
The perimeter is31.41592653589793

The area is 15.0
The perimeter is16.0

Process finished with exit code 0


如果GeometricObject里没有定义getArea方法,就不能在该程序中定义equalArea方法来计算这两个几何对象的面积是否相同。所以,现在可以看出在GeometricObject中定义抽象方法的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值