> For the complete documentation index, see [llms.txt](https://singularity-backend.gitbook.io/backend-online-doc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://singularity-backend.gitbook.io/backend-online-doc/week1/advanced-java.md).

# Java 进阶

面向对象、泛型、反射、注解

这一节会形象的讲解一下java的各种概念。具体的细节将会出现在本章的其他文章中。

{% hint style="warning" %}
这一章是关键的基础知识，请大家务必掌握，本文章更类似引入，之后会做详细解释。
{% endhint %}

## 面向对象

在学校的课程学习中我们大致了解了java的一大特点：面向对象。但这一特点在学习中总是显得那么的冗余。事实上在一些小一些的系统中完全没有必要使用面线对象这一设计模式。面向对象是专为大型工程而生的。

### 为什么需要面向对象？

因为人脑的内存不够多。如何理解这句话？在建立一个大型工程的时候经常会发生一个复杂系统中有各种各样的实体，他们之间有着错综复杂的关系，他们要求各种复杂的信息传递。假如我们不使用面向对象而仅仅使用面向过程的方式将他们组织起来就会相当困难。

打个比方：

&#x20;你想吃鱼香肉丝，你有两种选择：&#x20;

1．切肉丝、切青椒丝、切胡萝卜、配酱料、炒熟。&#x20;

2．冲进饭店喊一句：服务员，点一盘鱼香肉丝。&#x20;

前者自己操作所有材料，控制加工流程。这就是面向过程。后者，命令一个对象去解决问题，这就是面向对象。 而事实证明面向对象往往更符合人类的思维方式。&#x20;

毕竟接下来你就只需要吃了^\_^。

而更进一步的，为什么后者更简单。因为你可以对这个复杂的系统进行更细化的抽象。我们吧去饭店吃饭这个过程从做鱼香肉丝抽象成了：

* 你与服务员之间的点菜
* 服务员与后厨之间的点菜
* 后厨通知其中一位厨师开始做
* 其中一位厨师在约定好的地方（比如洗菜池里面）拿到能用菜
* 厨师炒菜
* 服务员把鱼香肉丝运到你的桌子上
* 你开始吃

这几个过程。

而这样抽象的好处就是每个实体也就是类能够各司其职。厨师只用思考炒菜，服务员只用思考跟顾客还有后厨沟通，后厨只用接收指令并分派任务，而你只负责吃。

我们可以轻松地发现这些复杂的动作是由一个个清晰地实体发出并完成的。加入我们把这些实体抽象成类，把复杂的动作抽象成方法就完成了初步的面向对象。

这样当我们在编写代码的时候你的脑子会轻松不少。在写厨师相关的代码时你跟不用关心外面的顾客究竟说哪国语言，因为服务员会帮你处理好，而服务员也不用关心后厨究竟怎么做菜，他只需要跟顾客沟通就好了。

{% hint style="info" %}
至于面向对象的三大特点：封装，多态，继承我们之后再来详细的说明。
{% endhint %}

## 反射

反射是一种很伟大的发明。反射体现的是动态性，当我们在编译时不知道要建什么对象时，可以在运行时通过反射动态的建对象。

### 这种情况会出现吗？

java相比其他语言最大的特点就是有一个无所不能的new，大家在日常使用中已经了习惯遇到什么东西new一下。在编写代码时，如果需要使用某一个类，必定先会去了解这是一个什么类，用来做什么，有怎么样的功能。之后才会对这个类进行实例化，以及使用对应的实例化对象进行下一步的操作。

而反射则是在代码一开始编写时不知道要初始化的类是什么，自然也无法使用 new 关键字来创建对象。

核心反射机制最初是为了基于组件的应用创建工具而设计的，如 Spring。

这类工具通常需要装载类，并且用反射功能找出它们支持哪些方法和构造器，允许用户交互式地构建访问这些类的应用程序。

反射功能只是在应用程序设计阶段被用到，通常来说，普通应用程序运行时不应该以反射方式访问对象。

## 泛型

### 什么是泛型

泛型，即“参数化类型”，就是将类型由原来的具体的类型参数化，类似于方法中的变量参数，此时类型也定义成参数形式（可以称之为类型形参），然后在使用/调用时传入具体的类型（类型实参）。

### 我们为什么需要泛型

开发中，经常有数值类型求和的需求，例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求和，需要重新在重载一个输入是double类型的add方法。

如果使用普通的方式完成这一过程你需要写8 \* 8 个方法才能把它们都覆盖。如果你的业务中还需要使用高精度那就更多了。而泛型则可以一次性解决所有问题。

## 注解

**`注解(Annotation)`**&#x5C31;是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。`Annotation` 是一个接口，程序可以通过反射来获取指定程序元素的 `Annotation` 对象，然后通过 `Annotation` 对象来获取注解里面的元数据。

`Annotation` 是 `JDK 5.0` 及以后版本引入的。它可以用于创建文档，跟踪代码中的依赖性，甚至执行基本编译时检查。`Annotation` 是一种应用于`包`、`类型`、`构造方法`、`方法`、`成员变量`、`参数`、`本地变量`的声明中的`特殊修饰符`。这些信息被存储在 `Annotation` 的 `“name=value”` 结构对中。

在注解出现之前，程序的元数据只是通过 java 注释和 javadoc，但是注解提供的功能要远远超过这些。注解不仅包含了元数据，它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序。
