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();
    }
}

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

相关推荐
彭于晏Yan6 分钟前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp
jzlhll1237 分钟前
Kotlin 协程高级用法之 NonCancellable
android·开发语言·kotlin
金銀銅鐵16 分钟前
[Java] 如何理解 class 文件中字段的 descriptor?
java·后端
5008421 分钟前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
我是唐青枫21 分钟前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
开发语言·c#·.net
芯芯点灯22 分钟前
gd32f303烧录提示Flash Timeout. Reset the Target and try it again.;
开发语言·前端·javascript
未若君雅裁24 分钟前
服务雪崩、降级、熔断与服务保护
java·微服务
枫叶丹427 分钟前
【HarmonyOS 6.0】Enterprise Space Kit:空间管理服务深入解析
开发语言·华为·harmonyos
就叫_这个吧41 分钟前
Java实现线程间的通讯--使用synchronized关键字和JUC方式实现
java·开发语言