# Java 基础语法


## Java 概述

### Java 语言概述

Java 是 SUN (Stanford University Network, 斯坦福大学网络公司) 于 1995 年推出的一门高级语言。Java 是一种面向 Internet 的编程语言，也是一种完全面向对象，安全可靠，与平台无关的编程语言。

<!--more-->

**Java5.0 之后的三大技术框架**

- J2EE (Java 2 Platform Enterprise Edition) 企业版

在 Jdk5.0 版本后称为 JAVAEE，是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 Servlet Jsp 等，主要针对于 Web 应用程序开发。

- J2SE (Java 2 Platform Standard Edition) 标准版

在 Jdk5.0 版本后称为 JAVASE，这是在 Java 基础阶段主要学习的内容，也是 Java 的基础，以后不管从事 Android 开发或者是物联网 + 云计算的开发等，是建立在 JSE 基础上的，因此该技术是 Java 的最核心技术。

- J2ME (Java 2 Platform Micro Edition) 小型版

在 Jdk5.0 版本以后称为 JAVAME，该技术多应用于一些电子产品的嵌入式开发，以前在手机开发上应用的也比较多，但是随着智能手机的发展，现在手机应用程序 (比如 Android 程序) 的开发已经不再使用该技术。

### JRE 和 JDK 的区别

JRE (Java Runtime Environment)，Java 运行环境。包括 Java 虚拟机 (JVM Java Virtual Machine) 和 Java 程序所需的核心类库等，如果想要运行一个开发好的 Java 程序，计算机中只需要安装 JRE 即可。

JDK (Java Development Kit Java)，开发工具包。JDK 是提供给 Java 开发人员使用的，其中 包含了 Java 的开发工具，也包括了 JRE。所以安装了 JDK，就不用在单独安装 JRE 了。

### JVM

JVM (Java Virtual Machine)，是运行所有 Java 程序的抽象计算机，是 Java 语言的运行环境，是 Java 最具吸引力的特性之一。JVM 读取并处理编译过的与平台无关的字节码 (class) 文件。

----

## 基础知识

### 代码注释

1. 单行注释

```java
// 单行注释
```

2. 多行注释

```java
/* 多
   行
   注
   释
 */
```

3. 文档注释

```java
/**
 * 文档注释
 */
```

### 标识符

标识符命名规则：
- 由字母、数字、下划线、$ 组成，不能以数字开头
- 区分大小写
- 不能使用关键字和保留字
- 不能使用 Java API 的类名

### 变量和常量

变量：占据着内存中的某一个存储区域，该区域有名称 (变量名) 和类型 (数据类型)，数据在同一类型范围内不断变化。

定义变量的格式：

**数据类型 变量名 = 初始化值**

作用范围：定义开始到定义它的代码块结束

**注意同一作用域内，不允许定义多个同名局部变量！**

### 成员变量和局部变量

1. 局部变量

- 定义在方法内的变量
- 没有默认初始值，使用前必须初始化
- 作用域是从定义开始到定义它的代码块结束

2. 成员变量

- 定义在方法内的变量
- 作用域是在整个类中

### 基本数据类型

Java 语言有 8 种基本数据类型，按用途分为以下 4 种类别：

| 类别   | 数据类型               |
| :----- | :--------------------- |
| 整数型 | byte、short、int、long |
| 小数型 | float、double          |
| 字符型 | char                   |
| 布尔型 | boolean                |

### 基本数据类型转换

#### 向上转型

容量小的类型可**自动转换**为容量大的数据类型！


#### 向下转型

容量大的类型不会转换为容量小的数据类型！

小转大，自动！自动类型转换 (也叫隐式类型转换)

大转小，强转！强制类型转换 (也叫显式类型转换)

### 运算符

| 类别       | 运算符                                  |
| :--------- | :-------------------------------------- |
| 算术运算符 | +、-、\*、/、%                          |
| 复制运算符 | =、+=、-=、*=、/=、%=                   |
| 关系运算符 | >、>=、<、<=、!=                        |
| 条件运算符 | &&、\|\|、!、&、\|、^                   |
| 位运算符   | &、\|、^、~、\>\>、\<\<、\>\>\>、\<\<\< |

“&”和“&&”的区别：单与时，左边无论真假，右边都进行运算。双与时，如果左边为真，右边参与运算，如果左边为假，那么右边不参与运算。

“|”和“||”的区别：同理，双或时，左边为真，右边不参与运算。

### 表达式和三目运算符

表达式是由数字、运算符和括号等组合能够计算数值的序列，按从高到低优先级依次计算。

三目运算符的格式：

```java
x ? y : z;
```

其中 x 为 boolean 类型表达式，若 x 为 true，则三目运算符的结果为 y 的值，否则为 z 的值。

### 程序流程控制

1. 顺序结构

程序从上至下依次执行，直到程序的最后。

2. 分支结构

- if-else 语句
- switch-case 语句

**switch 语句只能使用 byte、char、short、int 四种基本类型以及它们的包装类和枚举!**

3. 循环结构

- while: 不知道循环次数
- do-while: 不知道循环次数但是至少执行一次
- for: 知道循环次数

```java
for (1; 2; 3) {
    4;
}
```

执行顺序：1 -> 2 -> 4 -> 3 -> 2 -> 4 -> 3

**无限循环格式**

```java
while (true) {
    // do something
}
// or
for (;;) {
    // do something
}
```

4. 控制循环结构

- break: 终止本层循环
- continue: 跳过本次循环

----

## 方法与数组

### 方法的定义

方法是一组为了实现特定功能的代码块的集合。

### 方法的格式

```java
[修饰符] 返回值类型 方法名([参数类型 形式参数1, 参数类型 形式参数2, ...]) {
    执行语句;
    [return 返回值;]
}
```

### 方法里的属性

访问控制符是限定方法的可见范围。按可见范围从大到小依次是：`public`、`protected`、无、`private`，其中默认为无访问控制符。

| 属性       | 含义                     |
| :--------- | :----------------------- |
| 形式参数   | 方法调用时接收输入的数据 |
| 实际参数   | 方法调用时实际传入的数据 |
| 返回值     | 方法执行完后返回的数据   |
| 返回值类型 | 返回值的数据类型         |
| 方法签名   | 方法名和方法的参数列表   |

### 重载

在同一个类中，允许存在一个以上的同名方法，只要它们的参数个数或者参数类型或者参数顺序不同即可。

函数重载与返回值类型无关，只与参数列表有关。

```java
// eg.
public void func(int a);
public int func();
public void func(int a, String s);
```

### 可变参数

从 java5 开始出现了可变参数，这是对 java 方法及数组的拓展!

可变参数定义格式：

```java
返回值类型 方法名(参数类型 ... 形式参数) {
    // do something
}
```

**可变参数只能出现在参数列表的最后！**

调用可变参数的方法时，编译器为该可变参数隐含创建一个数组，在方法体中以数组的形式访问可变参数。

----

### 数组简介

数组 (Array) 是 Java 语言中内置的一种基本数据存储结构，通俗的理解，就是一组数的集合。

- 数组的元素编号从 0 开始，依次递增，方便访问。
- 必须先声明数组，再给数组分配内存。
- 数组对应内存中的一段连续空间。
- 数组元素是同一类数据类型。

### 一维数组

1. 声明

```java
type varName[];
// or
type[] varName[];  // 推荐
```

2. 初始化

- 静态初始化：初始化时指定每个数组元素的初始值，由系统决定数组长度。

```java
数组名 = new 数组类型[]{元素1，元素2，...};
// or
数组名 = {元素1，元素2，...};  // 简化
```

- 动态初始化：初始化时指定数组长度，由系统为数组元素分配初始值。

```java
数组名 = new 数组类型[数组长度];
```

**静态初始化和动态初始化不能同时使用！**

3. 数组的使用

```java
public class Demo {
    public static void main(String[] args) {
        int[] age = {1, 2, 3, 4, 5};
        for (int i = 0; i < age.length - 1; ++i) {
            System.out.println("age[" + i + "] = " + age[i]);
        }
    }
}
```

### 二维数组

二维数组其实是一个大的一维数组，它的每一个元素都是一个一维数组，可以看作是一张表格。

```java
int[][] arr = {{1, 2}, {3, 4}};  // 静态初始化
int[][] arr = new int[2][2];     // 动态初始化
```

### Arrays 类

使用数组工具类可以节省时间，提高效率，注意常查阅 api！

```java
static int binarySearch(type[] a, type key);  // 二分搜索法
static int binarySearch(type[] a, int fromIndex, int toIndex, type key);  // 二分搜索法
static boolean[] copyOf(type[] original, int newLength);  // 复制指定的数组
static byte[] copyOfRange(type[] original, int from, int to);  // 将数组的指定范围复制到一个新数组
static boolean equals(type[] a, type[] a2);  // 判断数组元素相等
static void fill(type[] a, type val);  // 数组所有元素都赋为 val
static void fill(type[] a, int fromIndex, int toIndex, type val);  // 数组元素都赋为 val
static void sort(type[] a);  // 按升序排序
static void sort(type[] a, int fromIndex, int toIndex);  // 按升序排序
static String toString(type[] a);  // 返回字符串表示形式
```

### for-each

```java
for (type varName : arrName) {
    // do something
}
```

----

## 面向对象

### 什么叫面向对象

面向对象 (Object-Oriented，简称 OO) 就是一种常见的程序结构设计方法。面向对象思想的基础是将相关的数据和方法放在一起，形成一种新的复合数据类型。

**面向对象的三个特征：**

- 封装
- 继承
- 多态

面向过程强调的是具体的功能实现，面向对象强调的是具备功能的对象。

### 类

类 (class) 是Java 语言的最小编程单位，也是设计和实现Java 程序的基础。

类是一组事物共有特征和功能的描述。类是抽象的，对象是具体的。

类的定义格式：

```java
[修饰符] class 类名 {
    构造方法;
    字段;
    方法;
}
```

### 构造方法

- 构造方法是用来构造类的实例，每一个类都有默认的无参构造方法。
- 字段是类或对象所包含的数据，对类状态的一种描述。
- 方法是类或对象的特征或行为。

作用：给类中的字段初始化，可以用来创建对象。

**构造方法与类名相同，没有返回值。多个构造方法以重载的形式存在。**

### static

`static` 的特点：

- 随着类的加载而加载
- 优先于对象存在
- 被所有对象所共享
- 可以直接被类名调用

1. 静态方法只能访问静态成员，但是非静态方法可以访问静态成员。
2. 静态方法中不可以使用 `this`、`super` 关键字
3. 利用类名调用静态 main 方法会陷入死循环，导致内存溢出，jvm 自动停止！

`static` 修饰的字段和方法表示属于类共用，而不属于单个实例。既可以通过类调用，也可以通过实例调用。

### 匿名对象

匿名对象是指一个没有名字的对象，只能调用一次。

### this

`this` 表示当前对象。

在类的构造器中相互调用，`this` 只能写在构造方法的第一行！

TODO

----

## 异常处理


----

## 常用类


----

## 线程技术

----

## 集合框架


----

## IO 操作


----

## 网络编程

----

## 反射机制


----


