携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
引言
知道的越多反而发现自己知道的越少
爱因斯坦和他的学生走在海滩上
爱因斯坦画了个小圆,又套了个大圆,对学生们说:
你们的知识好比小圆,我的知识好比大圆
大圆虽大,但是它所见的圆外的未知事物更多
介绍
抽象(Abstraction
) 是一个向用户隐藏实现细节的过程,只有功能会提供给用户,例如:返回一个人被视为人,而不是具体是一个学生还是男人;
也有思想是提取出鲸鱼与沙丁鱼的共同点的过程也是抽象
,其都需要水与都是水栖动物;
考虑一个学校打卡的真实例子,打卡只针对人群去打卡,而真正的实现细节上,老师、学生、保安等打卡后的实现逻辑无须关注,我们不清楚如何实现的,只关注了表面的点就是打卡,这其实就是抽象
.
在Java中,抽象
是通过接口
和抽象类
实现的。我们可以使用接口
实现100%抽象。
抽象类和抽象方法
抽象类与抽象方法使用示例
有时我们将需要定义一个超类,没有提供具体的方法体,每个方法声明一个给定的抽象的结构。
就是,有时我们会创建一个基类,定义一些泛用方法,将其与子类共享,把它留给每个子类来填充细节。
例如一个典型的Shape(形状)
,基类型是shape
,每个形状都有一种颜色,大小等.
由此,推导出了特定类型的形状(继承)-圆形
、方形
、三角形
等等.
每一个都可能有更多的特性
和行为
.例如,某些形状可以翻转,某些行为可能不同.
例如,在要计算形状的面积
上等等,类型层次结构体现了两者之间的异同形状。
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();
}
}
抽象的优点
- 减少了一些方法的复杂性.
- 避免代码重复,提高可重用性.
- 只有向用户提供了重要的细节有助于提高应用程序的安全.