Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java的抽象类

Java的抽象类

作者头像
鲜于言悠
发布于 2024-06-01 00:15:19
发布于 2024-06-01 00:15:19
10800
代码可运行
举报
文章被收录于专栏:c/c++的学习笔记c/c++的学习笔记
运行总次数:0
代码可运行
Java的抽象类

  • 前言
  • 一、抽象类是什么
  • 二、抽象类的语法规则
    • 示例
    • 注意事项
      • 抽象类不能直接实例化
      • 抽象方法不能是 private 的
      • 抽象类中可以包含其他的非抽象方法, 也可以包含字段.
  • 三、抽象类的作用
  • 四、拓展
    • 修饰符的混合使用

前言

推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1

Java的抽象类是一种特殊类,不能被实例化,但可以定义抽象方法和非抽象方法,作为其他类的基类。抽象方法没有具体实现,需在子类中被重写。抽象类用于实现抽象概念或行为,提供统一的接口供子类继承和实现。


一、抽象类是什么

抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类用来定义一些通用的属性和方法,但这些方法的具体实现是由其子类提供的。抽象类可以包含抽象方法,这些抽象方法没有具体的实现,而是由子类来实现。

抽象类通过使用关键字"abstract"来声明。当类中存在一个或多个抽象方法时,类必须声明为抽象类。抽象方法使用关键字"abstract"来声明,并且没有方法体。子类必须实现所有继承自抽象类的抽象方法。

抽象类也可以具有普通的方法和属性,这些方法和属性可以被子类继承和使用。抽象类可以被用作其他类的类型,并且可以作为方法的参数和返回值类型。

抽象类的作用是提供一种模板或骨架,用于定义一组相关的类的共同行为和方法签名。它可以提供一种标准和规范,用于确保子类都具备某些方法的实现,从而避免了代码的重复和冗余。抽象类是面向对象编程中的一个重要概念,它具有继承的特性和多态性。

二、抽象类的语法规则

示例

打印图形

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Shape {
    public void draw() {
        // 啥都不用干 
    }
}

class Cycle extends Shape {
    @Override
    public void draw() {
        System.out.println("○");
    }
}

class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("□");
    }
}

class Flower extends Shape {
    @Override
    public void draw() {
        System.out.println("♣");
    }
}

/我是分割线// 

// Test.java 
public class Test {
    public static void main(String[] args) {
        Shape shape1 = new Flower();
        Shape shape2 = new Cycle();
        Shape shape3 = new Rect();
        drawShape(shape1);
        drawShape(shape2);
        drawShape(shape3);
    }
    // 打印单个图形 
    public static void drawShape(Shape shape) {
        shape.draw();
    }
} 

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由Shape 的各种子类的 draw 方法来完成的.

像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class).

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Shape { 
 abstract public void draw(); 
} 
  • draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码).
  • 对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类.

注意事项

抽象类不能直接实例化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Shape shape = new Shape(); 
 
// 编译出错 
Error:(30, 23) java: Shape是抽象的; 无法实例化 
抽象方法不能是 private 的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Shape { 
 abstract private void draw(); 
} 
 
// 编译出错 
Error:(4, 27) java: 非法的修饰符组合: abstract和private 
抽象类中可以包含其他的非抽象方法, 也可以包含字段.

这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Shape {
    abstract public void draw();

    void func() {
        System.out.println("func");
    }
}

class Rect extends Shape { 
 ...
}

public class Test {
    public static void main(String[] args) {
        Shape shape = new Rect();
        shape.func();
    }
} 
 
// 执行结果 
func 

三、抽象类的作用

抽象类存在的最大意义就是为了被继承.

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.

有些读者可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?

确实如此. 但是使用抽象类相当于多了一重编译器的校验.

使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.

很多语法存在的意义都是为了 “预防出错”, 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.充分利用编译器的校验, 在实际开发中是非常有意义的.

四、拓展

修饰符的混合使用

大多数情况下,修饰符是可以混合使用的。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class Transportmeans

但有以下例外:

  • abstract不能与final 并列修饰同一个类
  • abstract不能与privatestaticfinalnative并列修饰同一个方法
  • abstract类中不应该有private的成员(包括属性和方法),因为不能被子类继承,这对abstract类而言就没有意义了。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java——抽象类和接口有什么区别
在运行时多态/动态绑定中通常会有些类中的方法没有具体的实现,而是在在被子类继承和重写之后才会安排具体的执行方法
小雨的分享社区
2022/10/26
2850
【JAVA抽象类和接口】
在Java中Object类是所有类的父类。默认它们都继承了Object这个父类,所有类的引用都可以用Object的引用来进行接收。
ImAileen
2024/12/08
1700
【JAVA抽象类和接口】
抽象类(java)
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
用户10921393
2024/01/23
1500
《JAVA SE》面向对象编程(中篇)
一段有坑的代码. 我们创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func。
VIBE
2022/12/02
2590
Java的接口
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/06/02
1110
Java的接口
抽象类和接口(1)(抽象类部分)
shape此时为抽象类类型,所以这时用它实例化创建对象就报错了。 所以抽象类的出现,就是要被继承,只有继承了抽象类才能使用它。
E绵绵
2024/04/08
980
抽象类和接口(1)(抽象类部分)
Javase-12.抽象类和接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
用户11369350
2024/11/19
510
Javase-12.抽象类和接口
Java语言【抽象类和接口】
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如:
用户11319080
2024/10/17
1210
Java语言【抽象类和接口】
【Java基础语法】抽象类和接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
用户11288949
2024/09/24
860
【Java基础语法】抽象类和接口
java面向对象——抽象类、接口
抽象类的概念有人会觉得有些抽象,下面我将彻头彻尾的介绍抽象类的概念及其应用 我们先来看下面这组代码
小雨的分享社区
2022/10/26
3700
java面向对象——抽象类、接口
JavaSE抽象类和接口
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
用户9645905
2023/04/12
2770
JavaSE抽象类和接口
欢迎来到我的Java世界“抽象类”
前言 在上篇中我们学习到了继承的概念、语法等等,那么小编将来为大家方享下一篇Java中的抽象类。
学无止尽5
2024/11/29
1210
欢迎来到我的Java世界“抽象类”
《JavaSE》---16.<抽象类&接口&Object类>
比如之前我们在面向对象系列中所提到的矩形、圆、花。他们都是图形。因此他们可以继承Shape类。而在Shape类中我们有draw方法。但是由于Shape类不是具体的图形。因此不会用到draw方法。而是矩形、圆、花它们用draw方法。因此draw方法其实在Shape类中无法具体实现。所以我们可以将Shape类设计成一个“抽象类”。而把其中的draw方法我们设计成“抽象方法”。
用户11288958
2024/09/24
1140
《JavaSE》---16.<抽象类&接口&Object类>
Java抽象类+接口
1)抽象类的关键字就是abstract,加上这个关键字之后就表示这个类就是一个抽象类;
阑梦清川
2025/02/24
500
Java抽象类+接口
【Java SE语法篇】9.抽象类和接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是放过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
爱敲代码的小杨.
2024/05/07
1530
【Java SE语法篇】9.抽象类和接口
Java——抽象类与接口的前世今生
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2020/04/13
8310
【Java 学习】:抽象类&接口
💢💢在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
IsLand1314
2024/10/15
1670
【Java 学习】:抽象类&接口
Java的多态
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/05/31
1150
Java的多态
【JavaSE】Java入门七(抽象类和接口详解)
抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。
小皮侠
2024/04/08
1920
【JavaSE】Java入门七(抽象类和接口详解)
Java基础系列4:抽象类与接口的前世今生
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2019/11/13
4940
相关推荐
java——抽象类和接口有什么区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验