java:Java中的抽象类

什么是抽象类:

我们知道,类用来模拟现实的事物,一个类模拟一类事物,某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性,当一个类中给出的信息足够全面时候,我们就可以实例化该类。 但是,**当一个类中给出的信息不够全面时,比如无法确定行为,它给出的信息不足以描绘出一个具体的对象,这时我们往往不会实例化该类,这种类就是抽象类。**例如,对于Animal类,所有动物都有吃喝的行为,定义eat可以描述吃这一行为,但每种动吃的都不一样,因此,一个eat方法并不能准确的描述吃什么。这时,Animal给出的信息就不足够描述一个对象,我们就不能去实例化Animal类。

在Java中,我们通过在类前面添加关键字abstract(抽象的)来定义抽象类。如:

java 复制代码
public abstract class Animal {
    //Animal类此时就是一个抽象类。
}
 
class Dog extends Animal {
    //Dog类继承了Animal类,是Animal类的子类。
}

抽象类的定义:

抽象方法

1.我们将"只有方法声明,没有方法体"的一类方法统称为抽象方法 ,抽象方法用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是只需要在()后面添加一个分号即可,否则IDEA会提示报错信息,如下图所示 :

错误的:

正确的:

2.如果一个类中已经出现了抽象方法,那么,这个类必须定义成抽象类。如:

总结:因此,有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。


3.应用:

当父类需要定义一个方法,却不能明确方法的具体细节时,可以将该方法定义为abstract,具体实现细节延时到子类。

我以Shape类,Circle类举例,代码如下:

java 复制代码
package Test;

 public abstract class Shape {//应添加abstract
     // 抽象方法,用于计算图形的面积
     public abstract double calculateArea();
}
// 子类继承抽象类,并实现抽象方法
class Circle extends Shape {
    private double radius;

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

    // 实现抽象方法,计算圆的面积
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

4.特点:

  • 如果父类定义了一个抽象方法,要求其所有的非抽象子类都必须重写该抽象方法,否则idea会报错。
  • 抽象方法不能再使用private,final,static关键字来修饰。这是因为定义抽象方法的目的就是想将方法的具体实现延迟到子类,最终是要被子类重写的,而private,final,static这几个关键字都和"方法重写"的目的背道而驰。

抽象类的特点:

1.抽象类不能被实例化,只能创建其子类对象:

即,我们不能创建抽象类对象(这里的对象指的是堆空间中的真正的对象,即不能new抽象类。

2.抽象类子类的两个选择:

即:要么实现父类的所有的抽象方法,要么子类本身也定义成抽象类。

抽象类的成员:

1.成员变量

抽象类既可以有静态的 成员变量 ,也可以有非静态的成员变量 。
既可以有静态的 成员常量 ,也可以有非静态的 成员常量 。

2.成员方法

抽象类既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非静态非final,因为abstract关键字与private关键字,static关键字,final关键字不能同时存在);

也可以有非抽象方法 (非抽象方法就可以用private,final和static关键字来修饰了,具体使用时,根据实际需求合理应用)。

3.构造器

抽象类可以和非抽象类一样拥有构造器,并且支持构造器的重载。

4.总结

抽象类中的成员只比非抽象类多一种------抽象方法。其他都和非抽象类一样。

5.代码演示

java 复制代码
// 定义一个抽象类
abstract class Shape {
    // 抽象方法,用于计算图形的面积
    public abstract double calculateArea();

    // 具体方法,用于打印图形的信息
    public void printInfo() {
        System.out.println("这是一个" + getShapeName() + ",面积为:" + calculateArea());
    }

    // 具体方法,用于获取图形的名称
    public abstract String getShapeName();
}

// 子类继承抽象类,并实现抽象方法
class Circle extends Shape {
    private double radius;

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

    // 实现抽象方法,计算圆的面积
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    // 重写具体方法,返回圆的名称
    public String getShapeName() {
        return "圆";
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;

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

    // 实现抽象方法,计算矩形的面积
    public double calculateArea() {
        return width * height;
    }

    // 重写具体方法,返回矩形的名称
    public String getShapeName() {
        return "矩形";
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(3.0);
        Rectangle rectangle = new Rectangle(4.0, 5.0);

        circle.printInfo();
        rectangle.printInfo();
    }
}

好了,抽象类内容暂时就这些,拜拜各位。

相关推荐
yz_aiks43 分钟前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵1 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设1 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都1 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
OpenAnolis小助手1 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
鱼宵1 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥2 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈2 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :2 小时前
Java 多线程详解:从入门到线程安全
java·python·安全
阿尼卡~2 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows