📜  Java中的抽象

📅  最后修改于: 2020-03-19 02:11:13             🧑  作者: Mango

数据抽象是仅向用户显示基本详细信息的属性,而琐碎的或非必需的单位不会显示给用户。例如:汽车被视为汽车,而不是其各个组成部分。
数据抽象也可以定义为忽略无关细节而仅识别对象的所需特征的过程。对象的属性和行为将其与相似类型的其他对象区分开,还有助于对对象进行分类/分组。考虑一个男人开车的真实例子。这个人只知道按下加速器会增加汽车的速度,或者踩刹车会停止汽车,但他不知道在按下加速器时速度实际上是如何增加的,他不知道汽车的内部机制或在汽车上实施油门,制动器等。这就是抽象。

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

  1. 抽象类是使用abstract关键字声明的类
  2. 抽象方法是无需执行即可声明的方法。
  3. 抽象类可以具有或可以不具有所有抽象方法。其中一些可以是具体方法
  4. 必须始终在子类中重新定义方法定义的抽象,从而使覆盖成为强制性,或者使子类本身成为抽象。
  5. 包含一个或多个抽象方法的任何类也必须使用abstract关键字声明。
  6. 没有抽象类的对象。也就是说,不能使用new运算符直接实例化抽象类。
  7. 抽象类可以具有参数化的构造函数,并且默认构造函数始终存在于抽象类中。

何时通过示例使用抽象类和抽象方法

在某些情况下,我们将需要定义一个超类,该超类声明给定抽象的结构,而不提供每个方法的完整实现。也就是说,有时我们会想要创建仅定义一个泛化形式的超类,该泛化形式将由其所有子类共享,然后将其留给每个子类来填充细节。
考虑一个经典的“形状”示例,该示例可能用于计算机辅助设计系统或游戏模拟中。基本类型是“形状”,每个形状都有颜色,大小等。由此,可以得出(继承)特定类型的形状-圆形,正方形,三角形等-每个形状可能具有其他特征和行为。例如,某些形状可以翻转。某些行为可能有所不同,例如,当您要计算形状的面积时。类型层次结构体现了形状之间的相似性和差异。

// Java展示抽象的类
abstract class Shape
{
    String color;
    // 抽象方法methods
    abstract double area();
    public abstract String toString();
    // 抽象类的构造器
    public Shape(String color) {
        System.out.println("Shape构造器被调用");
        this.color = color;
    }
    // 这是一个具体的方法
    public String getColor() {
        return color;
    }
}
class Circle extends Shape
{
    double radius;
    public Circle(String color,double radius) {
        // 调用Shape 构造器
        super(color);
        System.out.println("Circle构造器被调用");
        this.radius = radius;
    }
    @Override
    double area() {
        return Math.PI * Math.pow(radius, 2);
    }
    @Override
    public String toString() {
        return "Circle的颜色是 " + super.color +
                       "面积是: " + area();
    }
}
class Rectangle extends Shape{
    double length;
    double width;
    public Rectangle(String color,double length,double width) {
        // 调用Shape构造器
        super(color);
        System.out.println("Rectangle构造器被调用");
        this.length = length;
        this.width = width;
    }
    @Override
    double area() {
        return length*width;
    }
    @Override
    public String toString() {
        return "Rectangle的颜色是 " + super.color +
                           "面积是 : " + area();
    }
}
public class Test
{
    public static void main(String[] args)
    {
        Shape s1 = new Circle("Red", 2.2);
        Shape s2 = new Rectangle("Yellow", 2, 4);
        System.out.println(s1.toString());
        System.out.println(s2.toString());
    }
}

输出:

Shape构造器被调用
Circle构造器被调用
Shape构造器被调用
Rectangle构造器被调用
Circle的颜色是 Redand 面积是 : 15.205308443374602
Rectangle的颜色是 Yellowand 面积是 : 8.0

封装与数据抽象

  1. 封装是数据隐藏(信息隐藏),而抽象是细节隐藏(代码实现隐藏)。
  2. 封装将数据和作用于数据的方法组合在一起时,数据抽象处理的是将接口暴露给用户并隐藏实现细节。

抽象的优点

  1. 它降低了查看事物的复杂性。
  2. 避免代码重复并提高可重用性。
  3. 仅向用户提供重要的详细信息,有助于提高应用程序或程序的安全性。