一. 简介
前言
由于国内.net市场日渐萎靡,越来越少的企业使用.net,越来越多的企业投向JAVA的怀抱,一大批.net程序员的生存受到了极大的威胁, 在这生死存亡的时刻我们需要做出改变,以顺应时代的变化!
为什么是JAVA
java从1995年诞生至今饱受争议,风风雨雨已有20几年的历史,一路披荆斩棘,确定了自己的霸主地位,生命力顽强,常年雄踞编程排行榜第一位,就业广泛、待遇丰厚,使用JAVA的大厂有阿里巴巴、京东、美团、头条、拼多多、拍拍贷、携程、微盟等等等等,其中京东、拍拍贷、携程、微盟都是从.NET转向JAVA。
什么跨平台,面向对象就不说了,现在很多高级语言都有,一些特性,性能甚至比它还要好,就拿c#来对比,单从语言层面来讲要比JAVA优秀的多。
现在看来最关键的还是强大的生态圈,在国内又有阿里这种超级大厂支持,并开源了很多优秀的框架和组件,给java程序员提供各种解决方案。
JAVA三大体系
- Java SE(Java2 Platform Standard Edition,标准版)
- Java EE(Java 2 Platform,Enterprise Edition,企业版)
- Java ME(Java 2 Platform Micro Edition,移动版)
每个版本有对应的jdk(Orcale JDK和Open JDK)
JDK,JRE,JVM是什么
先了解下JDK,JRE,JVM是什么,他们之间有什么关系。
JVM :英文名称(Java Virtual Machine),就是我们常说的JAVA虚拟机,它能将JAVA源代码编译成的.class文件中的字节码指令翻译成计算机能识别的机器码让计算机执行,JVM是java跨平台的核心。
JRE :英文名称(Java Runtime Environment),Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。
JAVA开发人员只需要安装JDK(JDk包含JRE,JVM),非JAVA开发人员需要运行JAVA应用的话,可单独安装JRE。
下载安装配置
这里主要介绍下在windows环境下安装和配置,打开官网,选择Java SE版本选择Oracle JDK:
点击进入下载页面,接收协议,并且选择适合自己版本的JDK,这里我们选择windows 64位jdk,如图:
下载好之后进行安装,安装完成之后我们来进行环境变量配置,以win10为例,右击“此电脑”->"属性"->“高级系统设置”->“高级”->"环境变量":
用户变量是指当前登录的用户,系统变量是针对所有用户,我们在系统变量里面设置,点击新建:
1.设置JAVA_HOME变量,变量名输入“JAVA_HOME”,变量值为jdk的安装目录,点击确定。
然后在系统变量列表里面找到Path变量,点击编辑,然后点击新建:
输入jdk安装目录下的bin目录,点击确定。
JAVA_HOME变量作用是和第三方软件约定好引用jdk的目录。
2.设置Path变量,Path变量是命令搜索变量,在cmd命令窗口下输入命令会到指定的目录搜索命令。
来写一个HelloWorld
新建一个HelloWorld.java文件,打开文件输入如下代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
进入cmd命令提示符窗口,进入文件当前目录,输入:
javac HelloWorld.java
将java文件编译为.class文件(字节码文件),然后输入:
java HelloWorld
运行程序。
[图片上传失败...(image-2ecb1f-1554131747890)]
main方法是程序的入口,args是可以接收的参数,我们将上面代码改造一下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("参数1:"+args[0]+",参数2:"+args[1]);
}
}
在cmd命令窗口输入
javac -encoding utf-8 helloworld.java
(因为代码包含中文,可能会乱码导致无法编译,所以使用-encoding utf-8指定编码格式)编译成class文件,然后输入运行命令
java HelloWorld 翠花 上菜
注意:
java类名必须和文件名相同(不区分大小写),使用java命令运行程序时,java后面的名称是类名称(区分大小写)。
运行带包名的类文件
我们看下带包的类是如何编译和运行的,先将上面的代码再改造一下,改成带包的类,在第一行加入如下代码:
package cuihua;
完整代码如下:
package cuihua;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
把上面的代码放入名为cuihua的目录,在当前目录输入如下命令:
javac helloworld.java
java HelloWorld
[图片上传失败...(image-842e4a-1554131747890)]
执行java HelloWorld命令时报错,找不到入口,因为运行程序的时候是通过包名再找到类名,包名和目录需要对应,所以运行带包名的类库执行命令时需要将包名带上,执行命令改为如下代码:
java cuihua.HelloWorld
[图片上传失败...(image-ab3bc2-1554131747890)]
还是报错,我们仔细看下,我们所在的目录是cuihua,cuihua下面没有cuihua文件夹,所以需要返回上一级目录,再执行上面的命令,命令如下:
cd ../
java cuihua.HelloWorld
[图片上传失败...(image-a3ce57-1554131747890)]
多层/多级包
有了前面的知识铺垫之后,我们来思考一下如果包是多层的情况下,这个HelloWorld代码怎么运行?现在我们将上面的包名修改一下,修改如下:
package cuihua.shangcai
完整代码如下:
package cuihua.shangcai;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
这种情况下,该类文件应该放在cuihua/shangcai目录下,运行时在cuihua上一级目录运行,在cmd命令窗口输入如下代码:
javac cuihua/shangcai/helloworld.java
java cuihua.shangcai.HelloWorld
[图片上传失败...(image-9c0743-1554131747890)]
JAVA运行机制
java是一门高级语言,所写的程序计算机是无法识别的,所以就需要一种解释器将它翻译成本地计算机能识别的机器语言,从我们写的java程序到计算机能运行程序需要经过两个步骤,一个是将java源代码编译成与平台无关的.class字节码文件,然后交给jvm逐行翻译解释本地计算机能识别的机器语言并运行,所以我们通常所说的java跨平台不是指的java语言本身跨平台,而是jvm跨平台,jvm屏蔽了计算机平台相关性,每个计算机平台都有单独的jvm实现,比如windows下可以安装windows版的jre,mac下可以安装mac版本的jre,linux下安装linux版本的jre。
JIT编译器
JIT也叫做即时编译器,是一种动态编译技术,起初java运行性能远低于c/c++ 这类静态编译语言,自从引入JIT编译器之后,java可以提供与c/c++相当的性能,甚至还会高于它们,javac属于前端编译,jit属于后端编译。
graph TD
字节码文件 -->JIT编译器
JIT编译器 -->A{"是否已编译本地机器码"}
A --> |是| 执行本地机器码
A --> |否| 方法调用计数器+1
执行本地机器码
方法调用计数器+1 --> B{"计数器是否超过阈值"}
B --> |是| 向编译器提交编译请求
B --> |否| 以解释方式执行方法
向编译器提交编译请求 --> 以解释方式执行方法
以解释方式执行方法 --> 结束
执行本地机器码 --> 结束