• java 抽象类和接口——抽象类


    抽象类

    抽象类概念


    如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

    比如:

    说明:

    • 矩形、圆形、三角形都是图形,因此和GRaphael类的关系应该是继承关系。
    • 虽然图形Graph中也存在draw的方法,但是由于Graph不是具体的图形,因此其内部的draw方法实际是没有办法2实现的。
    • 由于Graph没有办法描述一个具体的图形,导致其draw方法无法具体实现,因此可以将Graph设置为“抽象类”。


    Graph的draw方法并没有什么具体的作用,像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法,包含抽象方法的类我们称为 抽象类。(abstract class)

    抽象类语法

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

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


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

    抽象类特性

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



    可以看到代码报错。

    1. 抽象方法不能是 private 的。


    代码报错


    注意:抽象方法没有加访问限定符时,默认是public

    1. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写。


    代码报错

    1. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰。


    代码会报错

    abstract class Graph1 {
        abstract public void draw();//画图形
        abstract void calcArea();
    
        public double getArea(){
            return area;
        }
        protected double area;
    }
    
    //矩形类
    class Rectangle extends Graph1 {
        private double length;
        private double width;
        Rectangle(double length, double width) {
            this.length = length;
            this.width = width;
        }
    
        public void calcArea(){
            area = length * width;
        }
    }
    
    //圆形类
    class Cycle extends Graph1 {
        private double r;
        final private static double PI = 3.14;
        public Cycle(double r){
            this.r = r;
    }
        public void draw(){
            System.out.println("圆:r = "+r);
        }
        public void calcArea(){
            area = PI * r * r;
        }
    }
    
    //三角形类
    class Triangle extends Graph1 {
        private double a;
        private double b;
        private double c;
    
        @Override
        public void draw() {
            System.out.println("三角形:a = " + a + " b = " + b + " c = " + c);
        }
    }
    
    public class TestDemo {
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    1. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
    2. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

    抽象类的作用

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

    就像上面的图形例子,画图形的实现不是父类来完成的,而是由子类来完成的。

    抽象类总结

    【总结】

    • 抽象类使用abstract修饰类。
    • 抽象类当中可以包含普通类所能包含的成员。
    • 抽象类和普通成员不一样的是,抽象类当中可以包含抽象方法。
    • 抽象方法是使用abstract修饰的,这个方法没有具体的实现。
    • 不能实例化抽象类。(new)
    • 抽象类存在的最大意义就是被继承。
    • 如果一个普通类继承了抽象类,此时必须重写抽象类当中的方法。
    • 如果一个抽象类A继承了一个抽象类B,此时A当中不需要重写B当中抽象方法。但是如果A再被普通类继承,就需要重写。
  • 相关阅读:
    Kotlin语法学习(四)_空指针检查
    无线传感器网络:数据链路层,MAC
    vue-主题切换
    JavaEE进阶 - Spring Boot 配置文件 - 细节狂魔
    CSShas伪类选择器案例附注释
    HarmonyOS ArkTS HTTP 请求简单封装(二十二)
    关于电影的HTML网页设计-威海影视网站首页-电影主题HTM5网页设计作业成品
    学习顺序表,Java实现
    二十、泛型(1)
    网络基本类型
  • 原文地址:https://blog.csdn.net/m0_63033419/article/details/126534162