• Java_抽象类


    目录

    1.抽象类语法

    2.抽象类特性

    3.抽象类的作用


    抽象类概念:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如:

    在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape 的各种子类的 draw 方法来完成的。像这种没有实际工作的方法, 我们可以把它设计成一个抽象方法(abstract method), 包含抽象方法的类我们称为抽象类(abstract class)。

    1. abstract class Shape {
    2. public abstract void draw();
    3. }
    4. class Rect extends Shape {
    5. @Override
    6. public void draw() {
    7. System.out.println("画矩形!");
    8. }
    9. }
    10. class Cycle extends Shape {
    11. @Override
    12. public void draw() {
    13. System.out.println("画圆!");
    14. }
    15. }
    16. public class Test {
    17. public static void drawShape(Shape shape) {
    18. shape.draw();
    19. }
    20. public static void main(String[] args) {
    21. //Shape shape = new Shape();抽象类不能实例化
    22. drawShape(new Rect());
    23. drawShape(new Cycle());
    24. }
    25. }

     

    1.抽象类语法

    在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。 

    1. //抽象类:被abstract修饰的类
    2. public abstract class Shape {
    3. //抽象方法:被abstract修饰的方法,没有方法体
    4. abstract public void draw();
    5. abstract void calcArea();
    6. // 抽象类也是类,也可以增加普通方法和属性
    7. public double getArea(){
    8. return area;
    9. }
    10. protected double area; // 面积
    11. }

    注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

    2.抽象类特性

    1)抽象类不能直接实例化对象

    2)抽象方法的修饰限定符不能是 private 的;

    1. abstract class Shape {
    2. abstract private void draw();
    3. }
    4. // 编译出错
    5. //Error:(4, 27) java: 非法的修饰符组合: abstract和private

    3)抽象方法不能被final和static修饰,因为抽象方法要被子类重写;

    4)抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰(即当一个子类没有重写父类中的抽象方法,可以把当前子类变为 abstract 修饰,但是当这个子类被另一个类继承时,继承子类的这个类还是得重写之前父类的抽象方法);

    5)抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类;

    6)抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

    3.抽象类的作用

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

    普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢? 确实如此,但是使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成。那么此时如果不小心误用成父类 了, 使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似。创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们。充分利用编译器的校验, 在实际开发中是非常有意义的。

  • 相关阅读:
    centos7.9 telnet其他服务器的端口不通
    牛客网刷题 | BC117 逆序输出
    【Rust日报】2022-07-18 Rust 1.62.1 pre-release 测试
    Python 中的分步机器学习
    ElementUI实现增删改功能以及表单验证
    编译原理复习笔记
    前端基础建设与架构导读 前端技术发展回顾和架构升级之路
    数组问题之《两数之和》以及《三数之和 》
    软件定义汽车的关键—车载操作系统
    python 炸敌人。
  • 原文地址:https://blog.csdn.net/m0_68071216/article/details/127934341