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

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

相关推荐
NiNg_1_23436 分钟前
JS模块化工具requirejs详解
开发语言·javascript·ecmascript
积水成江1 小时前
Vite+Vue3+SpringBoot项目如何打包部署
java·前端·vue.js·windows·spring boot·后端·nginx
CocoaAndYy2 小时前
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal原理及Demo
java·jvm·算法
2401_857439693 小时前
SpringBoot在线教育平台:设计与实现的深度解析
java·spring boot·后端
总是学不会.4 小时前
SpringBoot项目:前后端打包与部署(使用 Maven)
java·服务器·前端·后端·maven
IT学长编程4 小时前
计算机毕业设计 视频点播系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·视频点播系统
程序猿阿伟4 小时前
《C++音频降噪秘籍:让声音纯净如初》
开发语言·c++·网络协议
一 乐5 小时前
英语词汇小程序小程序|英语词汇小程序系统|基于java的四六级词汇小程序设计与实现(源码+数据库+文档)
java·数据库·小程序·源码·notepad++·英语词汇
Tech_gis5 小时前
C++ 观察者模式
开发语言·c++·观察者模式
卑微求AC5 小时前
继电器原理及应用
c语言·开发语言·51单片机·嵌入式