📅  最后修改于: 2020-03-19 02:11:13             🧑  作者: Mango
数据抽象是仅向用户显示基本详细信息的属性,而琐碎的或非必需的单位不会显示给用户。例如:汽车被视为汽车,而不是其各个组成部分。
数据抽象也可以定义为忽略无关细节而仅识别对象的所需特征的过程。对象的属性和行为将其与相似类型的其他对象区分开,还有助于对对象进行分类/分组。考虑一个男人开车的真实例子。这个人只知道按下加速器会增加汽车的速度,或者踩刹车会停止汽车,但他不知道在按下加速器时速度实际上是如何增加的,他不知道汽车的内部机制或在汽车上实施油门,制动器等。这就是抽象。
在Java中,抽象是通过接口和抽象类实现的。我们可以使用接口实现100%抽象。
抽象类和抽象方法:
何时通过示例使用抽象类和抽象方法
在某些情况下,我们将需要定义一个超类,该超类声明给定抽象的结构,而不提供每个方法的完整实现。也就是说,有时我们会想要创建仅定义一个泛化形式的超类,该泛化形式将由其所有子类共享,然后将其留给每个子类来填充细节。
考虑一个经典的“形状”示例,该示例可能用于计算机辅助设计系统或游戏模拟中。基本类型是“形状”,每个形状都有颜色,大小等。由此,可以得出(继承)特定类型的形状-圆形,正方形,三角形等-每个形状可能具有其他特征和行为。例如,某些形状可以翻转。某些行为可能有所不同,例如,当您要计算形状的面积时。类型层次结构体现了形状之间的相似性和差异。
// 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
封装与数据抽象
抽象的优点