---
title: 初识Java
date: 2020-05-16 19:28:35
tags: 
- Java
categories:
- Java基础
---

## java帝国的建立

1972 年C语言诞生 ，C语言具有贴近硬件，运行速度极快，效率极高的优点，一经诞生，就广泛用于操作系统、编译器、数据库、网络系统等的开发。但由于C语言的指针问题和内存管理的问题，对新手有一些不太友好。

<!--more-->

1982年C++诞生，C++兼容C语言，它增加了面向对象的特性，在图形领域和游戏方面取得了一些成就。但C++更加复杂。

1995年，java诞生，它语法有些像C，但没有C中的指针和内存管理问题；它实现了真正的可移植性，编写一次，到处运行；它也有面向对象的特性，有更安全的类型，有高质量的类库等优点。

### java的发展

1995年的网页简单而粗糙，缺乏互动性。java团队在浏览器中放入了java的运行环境，开发了一个图形界面程序(Applet)，使得网页变得更美观，有互动性。java进入了广大程序员的视线。

1998年，java 发布java2版本，该版本包含三个方向：

Java 2 标准版（J2SE）	针对桌面端开发

Java 2 移动版（J2ME）	针对移动端开发

Java 2 企业版（J2EE）	 针对服务器端开发

 但是Java SE 和Java ME当时并没有得到很好的发展。反而Java EE得到了很多IT大公司的应用 ，他们基于Java开发了许多的平台、系统、工具：

* 构建工具：Ant，Maven，Jekins
* 应用服务器：Tomcat，Jetty，Jboss，Websphere，weblogic
* Web开发：Struts，Spring，Hibernate，myBatis
* 开发工具：Eclipse，Netbean，intellij idea，Jbuilder
* ……

2006年，Hadoop的发布让Java进入大数据领域

2008年，Android的诞生，让Java重新进入了移动端领域，并在移动端开发中占据了举足轻重的地位。

之后，Java的发展就一发不可收拾，占据了服务器端开发的大部分市场，一个伟大的帝国诞生了！！

```tex
拓展：
“三高”问题：高可用，高性能，高并发。
```

## Java的特性和优势

* 简单性
* 面向对象
* 跨平台 可移植性
* 高性能
* 分布式
* 动态性（反射机制）
* 多线程
* 安全性
* 健壮性

## Java 的三大版本

### JavaSE 

标准版（桌面程序，控制台开发…）

### JavaME

嵌入式开发（手机，小家电…）

该版本几乎已经没有人用了

### JavaEE

企业级开发（web端，服务器开发…）

## JDK、JRE、JVM

JDK：Java Development Kit，称为Java开发包或者Java开发者工具，是一个编写Java的Applet小程序和应用程序的开发环境。JDK是整个Java的核心，包括了`Java运行环境(JRE)`，一些`Java工具`和`Java的核心类库(Java API)`。

JRE：Java Runtime Environment。JRE是个运行环境，JDK是个开发环境。因此写Java程序时需要JDK，而运行Java程序时就需要JRE。而JDK中已经包含了JRE，因此只要安装了JDK就可以编辑Java程序，也可以正常运行Java程序。

JVM：Java Virtual Machine

![](https://i.loli.net/2020/05/09/h5MHDELCjmzKvcY.png)

## JDK的安装

https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

去上面网址下载对应的版本

下载后双击安装，记住安装的路径

**配置环境变量**

右键点击此电脑，打开属性，找到高级系统设置->环境变量->系统变量

1. 新建一个变量JAVA_HOME，值为jdk安装的路径

![](https://i.loli.net/2020/05/09/dF2PvYc5eJ8H9nD.png)

2. 配置Path变量，找到系统变量中的Path变量，点击编辑，新建两个，值分别为`%JAVA_HOME%\bin`，`%JAVA_HOME%\jre\bin`

![](https://i.loli.net/2020/05/09/uaRCMe71En3XG9V.png)

配置好环境变量之后，打开cmd(终端)，输入 

```bash
java -version
```

出现下图效果说明JDK安装配置成功

![](https://i.loli.net/2020/05/09/hTROlwQ7uWEyVaJ.png)

## 第一个程序

**HelloWorld**

步骤：

1. 新建一个文件夹，存放代码
2. 新建一个Java文件(Hello.java)
3. 编写代码

```java
public class Hello{
	public static void main(String[] args){
		System.out.print("Hello,World!");
	}
}
```

4. 编译 ，打开终端，输入命令

	```bash
	javac -Hello.java
	```

	编译完成后生成一个Hello.class文件，再输入运行命令

	```bash
	java Hello
	```

	就能看到终端中打印出了 `Hello,World!`

![](https://i.loli.net/2020/05/09/oLXTjy8ECYeFV25.png)

**可能遇到的问题**

* 每个单词的大小写不能出现问题，**Java对大小写敏感**
* 文件名 和 类名必须保持一致，并且首字母大写
* 符号要用英状态下的符号

## Java程序运行机制

### 编译型与解释型

我们知道，计算机是无法理解现在的高级语言程序的，计算机只能理解机器语言，也就是可以通过CPU进行分析和执行的指令集。而要想让计算机能够运行我们写的高级语言程序，就需要一个系统软件来实现，它就是**`语言处理程序`**，也称为**`编译程序`**，它可以将我们写的高级语言程序，翻译成计算机可执行的**`机器语言`**。而这个翻译的方式就分为**`编译型`**和**`解释性`**两种。

**`编译型：`**是有一个负责翻译的程序来对我们的源代码进行转换，生成相对应的可执行代码(机器码),这个过程就被称为编译,而来编译的程序也就被称为编译器,也就是说我们写一个程序代码在源文件当中,通常经过编译以后生成一个可执行文件,这样我们就可以直接运行了。

**`解释型：`**在程序运行的前一刻，还只有源程序没有可执行程序,而当执行时每执行到源程序的某一条指令，则会有有一个称为解释程序的外壳程序将源代码转换成二进制代码以供执行,也就是说一边解释 一边执行 ,所以解释型程序是离不开解释程序的。

从上面我们可以看出，编译型和解释型的关键区别就在于这个翻译的时机不同。解释型语言在运行程序的时候才翻译,每执行一次,要翻译一次,效率较低。编译型就是直接编译成机器可以执行的格式,只翻译一次。

编译型和解释型各有优缺点

优点:

解释型:可移植性好,只要有运行相应需要的解释环境,可以在不用的操作系统上运行,修改调试也非常方便

编译型:相比解释执行编译执行效率高，占用资源小，适合复杂程序

缺点:

解释型:一句一句执行解释,浪费计算机资源,效率低

编译型:兼容性差,编译型程序虽然源代码也可以移植，但前提是必须针对不同的系统分别进行编译.

### Java程序运行机制

**Java这个语言有些特殊，它既是编译型的，又是解释型的**

说Java是编译型的，是因为所有的Java代码都是要编译的，.java不经过编译就什么用都没有。

说Java是解释型的，是因为java代码编译后不能直接运行，它是解释运行在JVM上的，所以它是解释运行的，那也就算是解释型的了。 

但是，现在的JVM为了效率，都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行，所以，又是编译的。像C、C++ 他们经过一次编译之后直接可以编译成操作系统了解的类型，可以直接执行的 所以他们是编译型的语言。没有经过第二次的处理 而Java不一样，他首先由编译器编译成.class类型的文件，这个是Java自己类型的文件 ，然后再通过虚拟机(JVM)从.class文件中读一行解释执行一行，所以他是解释型的语言，而由于Java对于多种不同的操作系统有不同的JVM所以 Java实现了真正意义上的跨平台！

观看下面两张图 了解一下Java的虚拟机机制：

> 1.java语言的编译-->解释--->执行过程
>
> ![java语言的编译-->解释--->执行过程](https://i.loli.net/2020/05/10/HtRmwf4LBIr1qPS.jpg)

![java虚拟机JVM](https://i.loli.net/2020/05/10/ITZEnaNuweHiflQ.jpg)

> 如果严格按照定义来说，Java应该是解释型语言，因为*.java程序在编译之后，被编译为\*.class文件，并不是机器码，依然不能被计算机直接运行。\*.class文件是在JVM中被解释运行的。

