java 抽象类

抽象类

在java中,抽象类是一种不能实例化的类,通常用于表示一个抽象概念或者提供一个抽象模板,供其他类继承。抽象类包括抽象方法(没有实现的方法)和具体方法(有实现的方法)。

抽象类的特点:

  • 不能被实例化。
  • 包含抽象方法。抽象方法没有具体的实现,它只声明方法的签名,具体的实现由子类提供。
  • 包含具体方法。抽象类也可以包含具体方法,这些方法有实现的代码。
  • 子类继承。其他类可以通过继承来扩展抽象类,子类必须实现抽象类中的所有抽象方法,除非子类也是抽象类。

抽象方法,在方法头中用abstract修饰。包含抽象方法的类就成为一个抽象类,在类头用abstract修饰。

抽象方法:

1、所有的子类都具有的共同的行为特征,该行为特征在父类不可描述

2、只有方法的定义没有方法的实现,交由子类去实现。

举个例子:假如Geometric类定义成Circle和Rectangle的父类。Geometric类模拟了几何对象的共同特征。Circle类和Rectangle类分别包含计算面积和周长的方法getArea()和getPerimeter().。因为可以计算所有几何对象的面积和周长。但是这样的方法不能在Geometric类中实现,因为它们的实现取决于几何对象的具体类型。

package edu.uestc.avatar.geometric;

import java.time.LocalDate;

/**
 * 抽象类可以有构造方法,但是不能创建抽象类的实例,交给子类的构造方法进行调用
 *
 */
public abstract class Geometric {
    private LocalDate createDate;
    private String color;
    private boolean filled;
    
    public Geometric() {
        this.createDate = LocalDate.now();//当前系统日期
    }
    public Geometric(String color, boolean filled) {
        this.createDate = LocalDate.now();//当前系统日期
        this.color = color;
        this.filled = filled;
    }
    public LocalDate getCreateDate() {
        return createDate;
    }
    public void setCreateDate(LocalDate createDate) {
        this.createDate = createDate;
    }
    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;
    }
    
    /**
     * 抽象方法:所有的子类都具有的共同的行为特征,该行为特征在父类不可描述----抽象方法
     * 只有方法的定义没有方法的实现,交由子类去实现
     * 包含抽象方法的类必须是一个抽象类
     * @return
     */
    public abstract double getArea();
    
    public abstract double getPerimeter();
}

由于其计算周长和面积的具体方法在父类中不可描述,要交给子类去实现:如下例子:circle.java

子类继承抽象类,必选实现抽象类中所有的抽象方法,否则子类也应该是一个抽象类,交由具体的子类去实现。



/**
 * 子类继承抽象类,必选实现抽象类中所有的抽象方法,否则子类也应该是一个抽象类,交由具体的子类去实现
 *
 */
public class Circle extends Geometric{
    public static final double PI = 3.14;
    private double radius;
    
    public Circle() {
        
    }
    public Circle(double radius) {
        this.radius = radius;
    }
    public Circle(double radius,String color,boolean filled) {
        super(color,filled);
        this.radius = radius;
    }
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }
    
    /**
     * 计算圆几何图形的面积
     */
    public double getArea() {
        return PI * radius * radius;
    }
    
    public double getPerimeter() {
        return 2 * PI * radius;
    }
    
    @Override //edu.uestc.avatar.geometric.Circle@24356b
    public String toString() {
        String ret = "circle:(area:" + getArea() + ",perimeter:" + getPerimeter();
        if(isFilled()) 
            ret += "filled, color:" + getColor();
        return ret + ")";
    }
}

第二个子类 rectangle.java



public class Rectangle extends Geometric{
    private double width;
    private double height;
    
    public Rectangle() {
        
    }
    public Rectangle(double width,double height) {
        this.width = width;
        this.height = height;
    }
    public Rectangle(double width,double height,String color,boolean filled) {
        super(color,filled);
        this.width = width;
        this.height = height;
    }
    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;
    }
    
    @Override
    public double getPerimeter() {
        return 2 * (width + height);
    }
    @Override
    public double getArea() {
        return width * height;
    }
}

以上就是抽象类相关知识点。但是我们为何要使用抽象方法呢?

抽象方法的优点

  • 强制子类实现:抽象方法强制子类必须提供具体的实现。这有助于确保所有继承自抽象类的子类都遵循相同的接口规范,从而保证多态性。
  • 定义通用接口:抽象方法定义了一个通用的行为接口,而具体的实现则留给子类去完成。这样,抽象类就可以作为一个通用的模板,而具体的行为则由子类根据实际情况来实现。
  • 代码复用:抽象类可以包含一些通用的代码,这些代码可以在子类中复用。子类可以继承这些代码,并根据自己的需求进行扩展或修改。
  • 提高可维护性:抽象方法使得代码更加模块化和可维护。通过定义抽象方法,开发者可以清晰地定义类的职责和功能,使得代码结构更加清晰。
  • 多态性:抽象方法是实现多态的关键。在Java中,多态允许我们使用父类的引用来引用子类的对象,从而可以在运行时动态地调用子类的方法。

抽象方法和抽象类的命令规则

  • 抽象方法必须使用abstract 进行修饰,抽象类也必须使用abstract 进行修饰,抽象方法不能具有具体的方法体。
  • 抽象类不能被实例化,即不能使用关键字new 创建对象实例。
  • 抽象类可以包含属性、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类、枚举类六种成分。抽象类的构造器不能用于创建实例,主要用于被其子类调用。
  • 含有抽象方法的类只能被定义成抽象类。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值