📜  Java中的抽象

📅  最后修改于: 2022-05-13 01:55:48.163000             🧑  作者: Mango

Java中的抽象

数据抽象是仅向用户显示基本细节的属性。琐碎或非必要的单元不会显示给用户。例如:汽车被视为一辆汽车,而不是它的单个组件。

数据抽象也可以定义为仅识别对象所需特征而忽略不相关细节的过程。对象的属性和行为将其与其他类似类型的对象区分开来,并且还有助于对对象进行分类/分组。

考虑一个男人开车的真实例子。这个人只知道踩油门会增加汽车的速度或踩刹车会使汽车停下来,但他不知道踩油门时速度实际上是如何增加的,他不知道汽车的内部机制。汽车或在车内实施油门、刹车等。这就是抽象。

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

抽象类和抽象方法:

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

何时使用抽象类和抽象方法并举例说明

在某些情况下,我们希望定义一个超类来声明给定抽象的结构,而不提供每个方法的完整实现。也就是说,有时我们会想要创建一个只定义一个泛化形式的超类,该泛化形式将由其所有子类共享,而将其留给每个子类来填写细节。

考虑一个经典的“形状”示例,可能用于计算机辅助设计系统或游戏模拟。基本类型是“形状”,每个形状都有颜色、大小等。由此衍生(继承)特定类型的形状——圆形、方形、三角形等——每种形状都可能具有额外的特征和行为。例如,某些形状可以翻转。某些行为可能会有所不同,例如当您要计算形状的面积时。类型层次体现了形状之间的相似之处和不同之处。


Java
// Java program to illustrate the
// concept of Abstraction
abstract class Shape {
    String color;
  
    // these are abstract methods
    abstract double area();
    public abstract String toString();
  
    // abstract class can have the constructor
    public Shape(String color)
    {
        System.out.println("Shape constructor called");
        this.color = color;
    }
  
    // this is a concrete method
    public String getColor() { return color; }
}
class Circle extends Shape {
    double radius;
  
    public Circle(String color, double radius)
    {
  
        // calling Shape constructor
        super(color);
        System.out.println("Circle constructor called");
        this.radius = radius;
    }
  
    @Override double area()
    {
        return Math.PI * Math.pow(radius, 2);
    }
  
    @Override public String toString()
    {
        return "Circle color is " + super.getColor()
            + "and area is : " + area();
    }
}
class Rectangle extends Shape {
  
    double length;
    double width;
  
    public Rectangle(String color, double length,
                     double width)
    {
        // calling Shape constructor
        super(color);
        System.out.println("Rectangle constructor called");
        this.length = length;
        this.width = width;
    }
  
    @Override double area() { return length * width; }
  
    @Override public String toString()
    {
        return "Rectangle color is " + super.getColor()
            + "and area is : " + 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 constructor called
Circle constructor called
Shape constructor called
Rectangle constructor called
Circle color is Redand area is : 15.205308443374602
Rectangle color is Yellowand area is : 8.0

封装与数据抽象

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

抽象的优点

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

相关文章 :

  • Java中的接口
  • Java中的抽象类
  • 抽象类和接口的区别
  • Java中的抽象关键字