Java基础篇:抽象

引言

知道的越多反而发现自己知道的越少
爱因斯坦和他的学生走在海滩上,爱因斯坦画了个小圆,又套了个大圆,对学生们说:
你们的知识好比小圆,我的知识好比大圆;
大圆虽大,但是它所见的圆外的未知事物更多。

介绍

抽象(Abstraction) 是一个向用户隐藏实现细节的过程,只有功能会提供给用户,例如:返回一个人被视为人,而不是具体是一个学生还是男人;
也有思想是提取出鲸鱼与沙丁鱼的共同点的过程也是抽象,其都需要水与都是水栖动物;

考虑一个学校打卡的真实例子,打卡只针对人群去打卡,而真正的实现细节上,老师、学生、保安等打卡后的实现逻辑无须关注,我们不清楚如何实现的,只关注了表面的点就是打卡,这其实就是抽象.

在Java中,抽象是通过接口抽象类实现的。我们可以使用接口实现100%抽象。

抽象类和抽象方法

抽象类和抽象方法

抽象类与抽象方法使用示例

有时我们将需要定义一个超类,没有提供具体的方法体,每个方法声明一个给定的抽象的结构。
就是,有时我们会创建一个基类,定义一些泛用方法,将其与子类共享,把它留给每个子类来填充细节。
例如一个典型的Shape(形状),基类型是shape,每个形状都有一种颜色,大小等.
由此,推导出了特定类型的形状(继承)-圆形方形三角形等等.
每一个都可能有更多的特性行为.例如,某些形状可以翻转,某些行为可能不同.
例如,在要计算形状的面积上等等,类型层次结构体现了两者之间的异同形状。
image.png
Shape.java

/**
 * Java程序说明-抽象的概念
 * 形状
 */
public abstract class Shape {
    String color;

    // 这些是抽象方法
    abstract double area();

    public abstract String toString();

    // 抽象类可以有构造函数
    public Shape(String color) {
        System.out.println("调用形状构造函数");
        this.color = color;
    }

    // 这是一个具体的方法
    public String getColor() {
        return color;
    }
}

Circle.java

/**
 * 圆形
 */
public class Circle extends Shape {

    double radius; // 半径

    public Circle(String color, double radius) {
        // 调用 Shape 构造函数
        super(color);
        System.out.println("调用圆的构造函数");
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * Math.pow(radius, 2);
    }

    @Override
    public String toString() {
        return "圆圈颜色为" + super.getColor() + "和面积是 : " + area();
    }
}

Rectangle.java

// 长方形
class Rectangle extends Shape {

    double length, width;

    public Rectangle(String color, double length,
                     double width) {
        // 调用Shape构造函数
        super(color);
        System.out.println("调用长方形构造函数");
        this.length = length;
        this.width = width;
    }

    @Override
    double area() {
        return length * width;
    }

    @Override
    public String toString() {
        return "长方形颜色为" + super.getColor()
                + "和面积是: " + area();
    }
}

TestShape.java

public class TestShape {
    public static void main(String[] args) {
        Shape s1 = new Circle("黑", 10);
        Shape s2 = new Rectangle("白", 10, 10);

        System.out.println(s1.toString());
        System.out.println(s2.toString());
    }
}

输出

调用形状构造函数
调用圆的构造函数
调用形状构造函数
调用长方形构造函数
圆圈颜色为黑和面积是 : 314.1592653589793
长方形颜色为白和面积是: 100.0

使用接口实现100%隐藏细节

public interface Check {
    void checkIn();
}
public class StudentCheck implements Check {
    @Override
    public void checkIn() {
        System.out.println("滴!学生卡");
    }
}
public class TeacherCheck implements Check {
    @Override
    public void checkIn() {
        System.out.println("滴!老师卡");
    }
}
public class TestCheck {
    public static void main(String[] args) {
        Check checkOne = new StudentCheck();
        Check checkTwo = new TeacherCheck();
        checkOne.checkIn();
        checkTwo.checkIn();
    }
}

抽象的优点

  • 减少了一些方法的复杂性.
  • 避免代码重复,提高可重用性.
  • 只有向用户提供了重要的细节有助于提高应用程序的安全.

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员鱼丸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值