20、Java 中的抽象类

简介: 20、Java 中的抽象类


一、抽象方法(Abstract Method)

📖 被abstract关键字修饰的方法就是抽象方法

📖 抽象方法只能定义在抽象类接口

📜 被abstract关键字修饰的就是抽象类

📜 接口通过interface关键字创建;通过class关键字创建

📖 抽象方法只有方法声明,没有方法实现(参数列表后面不是大括号,而是 ;【分号】)

📖 抽象方法不能被private关键字修饰

📜 定义抽象方法就是希望让子类去继承的

📖 抽象方法不能被 static 关键字修饰

📜 抽象方法只能是实例方法,不能是类方法

📖 抽象方法不能被 final 关键字修饰

📜 抽象方法天生就是要被重写的(被final关键字修饰的方法不能被重写)

二、抽象类(Abstract Class)

✏️ 抽象类在非抽象类的基础上多了一个功能:可以定义抽象方法

✏️ 抽象类在非抽象类的基础上少了被实例化的能力

📖 抽象类:被abstract关键字修饰的类

📜 抽象类内部可以定义抽象方法

📜 抽象类不能被实例化,但可以有构造方法(抽象类的构造方法是拿来让子类调用的)

📜 子类必须实现抽象父类中的所有抽象方法(除非子类也是抽象类)

📜 抽象类可以像非抽象类一样定义成员变量、常量、嵌套类型、初始化块、非抽象方法等

📜 抽象类也可以完全不定义抽象方法

三、抽象类使用场景(特别好用)

📖【抽取子类的公共实现】抽取子类的公共实现到抽象父类中,要求子类必须要单独实现的定义成抽象方法

☆ 抽象类案例(圆和矩形的面积与周长)

① 未使用抽象类抽取公共代码前

圆类:

public class Circle {
    /* 半径 */
    private double radius;
    /* 周长 */
    private double girth;
    /* 面积 */
    private double area;
    public Circle(double radius) {
        this.radius = radius;
    }
    /**
     * 返回圆的面积
     */
    public double getArea() {
        return area;
    }
    /**
     * 返回圆的周长
     */
    public double getGirth() {
        return girth;
    }
    public void showAreaGirth() {
        // half: 周长的一半
        double half = Math.PI * radius;
        area = half * radius;
        girth = 2 * half;
        System.out.println("\n---------圆--------");
        System.out.println("周长:" + girth);
        System.out.println("面积:" + area);
        System.out.println("-------------------");
    }
}

矩形类:

public class Rectangle {
    /* 宽 */
    private double width;
    /* 高 */
    private double height;
    /* 面积 */
    private double area;
    /* 周长 */
    private double girth;
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    /**
     * 返回矩形的面积
     */
    public double getArea() {
        return area;
    }
    /**
     * 返回矩形的周长
     */
    public double getGirth() {
        return girth;
    }
    public void showAreaGirth() {
        area = width * height;
        girth = 2 * (width + height);
        System.out.println("\n---------矩形--------");
        System.out.println("周长:" + girth);
        System.out.println("面积:" + area);
        System.out.println("---------------------");
    }
}

测试类

public class TestDemo {
    public static void main(String[] args) {
        Circle circle = new Circle(3);
        circle.showAreaGirth();
        Rectangle rectangle = new Rectangle(2, 8);
        rectangle.showAreaGirth();
        
        /*
             output:
                ---------圆--------
                周长:18.84955592153876
                面积:28.274333882308138
                -------------------
                
                ---------矩形--------
                周长:20.0
                面积:16.0
                ---------------------
         */
    }
}

📜 CircleRectangle 两个类中都有 area、girth 两个属性和 getArea、getGirth、showAreaGirth 三个方法

📜 CircleRectangle 两个类中的 getArea 和 getGirth 的实现一模一样,并且 showAreaGirth 中的部分代码也是一样的

📜 可通过抽象类这种技术把两个类中的代码进行抽取


② 使用抽象类抽取代码

抽象父类:

public abstract class ShapeAbstract {
    protected double area;
    protected double girth;
    public double getArea() {
        return area;
    }
    public double getGirth() {
        return girth;
    }
    protected abstract String calculate();
    public void showAreaGirth() { 
        String shape = calculate();
        System.out.println("\n---------" + shape + "--------");
        System.out.println("周长:" + girth);
        System.out.println("面积:" + area);
        System.out.println("-------------------");
    }
}

public class Circle extends ShapeAbstract {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    @Override
    protected String calculate() {
        double half = Math.PI * radius;
        area = half * radius;
        girth = 2 * half;
        return "圆";
    }
}

矩形

public class Rectangle extends ShapeAbstract {
    private double width;
    private double height;
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    @Override
    protected String calculate() {
        area = width * height;
        girth = 2 * (width + height);
        return "矩形";
    }
}

📌 结束!如有错误,请不吝赐教。

相关文章
|
3月前
|
存储 Java 开发者
抽象类和接口,你不知道的秘密!Java编程新视角
抽象类和接口,你不知道的秘密!Java编程新视角
37 5
|
3月前
|
设计模式 Java 开发者
抽象类和接口如何改变你的编程方式?Java界的革命
抽象类和接口如何改变你的编程方式?Java界的革命
45 3
|
6天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
8天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
10 2
|
10天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
16 2
|
2月前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
26 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
26天前
|
安全 Java 数据安全/隐私保护
【一步一步了解Java系列】:探索抽象类与接口的秘密
【一步一步了解Java系列】:探索抽象类与接口的秘密
25 3
|
2月前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
20 5
Java——抽象类和接口
|
1月前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
48 0
Java中抽象类和接口有什么区别?
|
2月前
|
Java
Java 抽象类详解
在 Java 中,抽象类是一种特殊类,用于提供基础定义并派生具体子类,支持代码复用。它包含抽象方法(无实现)和具体方法(有实现),不能被实例化,需用 `abstract` 关键字定义。子类必须实现所有抽象方法,除非子类也是抽象类。抽象类可用于定义模板或框架,确保子类实现特定方法。通过示例展示了如何定义抽象类 `Animal` 及其子类 `Dog` 和 `Cat`,并在主类中调用相关方法。使用抽象类可以提高代码复用性和设计质量,但也可能增加维护难度和性能开销。