第20篇:Java 中的抽象类

简介: 📖 被abstract关键字修饰的方法就是抽象方法📖 抽象方法只能定义在抽象类或接口中📜 被abstract关键字修饰的类就是抽象类📜 接口通过interface关键字创建;类通过class关键字创建📖 抽象方法只有方法声明,没有方法实现(参数列表后面不是大括号,而是 ;【分号】)

一、抽象方法(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 "矩形";
    }

}

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