Java基础回炉暨系列开篇——深入Java基础系列(一)

前言

万丈高楼平地起,没有扎实的技术基础注定不会走太远。以前自认为具有多年的开发经验,早就对Java基础知识已经掌握得炉火纯青。但是在面试的时候,面对面试官刨根问底的提问,总是回答得模棱两可,甚至直接说不太了解,这样的面试结果总是差强人意的。要想在技术的路上走得更远,更深,还是要踏踏实实的掌握基础的知识,并在原本的知识储备上有所提升。

《深入Java基础》这一系列将围绕Java语言的基本特性和机制,将碎片知识系统化,巩固Java技术功底,达到“知其然也知其所以然”的目的,从容面对面试官刨根问底般的暴击。


目录

1. 概述

1.1 Java技术体系

1.2 关键术语

1.3Java优点

2. Java语言重要特性

2.1 跨平台

3. Java虚拟机

4. 环境配置

4.1 配置Path环境变量

4.2 配置JAVA_HOME环境

4.3 配置Classpath环境

4.4 设置临时环境变量

5. 相关面试

5.1  Java是解释执行吗?


1. 概述

Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

1.1 Java技术体系

(1)广义上讲,运行于Java虚拟机上的语言(Clojure、JRuby、Groovy)及其相关的程序都属于Java技术体系中的一员。从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:

  • Java程序设计语言;
  • 各种硬件平台上的Java虚拟机(JVM);
  • Class文件格式;
  • Java API类库(JAVA SE API子集);
  • 来自商业机构和开源社区的第三方Java类库。

(2)按照技术所服务的领域来划分,Java技术体系可以分为4个平台,分别为:

  • Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
  • Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
  • Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
  • Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充并提供了相关的部署支持,例Web 服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和Web 2.0 应用程序。

注释:一般Java SE API的核心包以java.*为包名,扩充的包以javax.*作为包名。但由于历史原因,一部分曾经是扩展包的API后来进入了核心包,因此核心包中也包含了不少javax.*的包名。

1.2 关键术语

JDK:Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境(开发人员需搭建的环境,语言+api+JVM

JRE:Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可,JVM+API)。

1.3Java优点

Java的诞生已经超过了20年,一直以来,它以优秀的特性吸引了无数程序员学习和使用,各大公司对Java工程师的需求也是源源不断。

  • 它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;
  • 它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;
  • 它实现了热点代码检测(采样热点监测和计数监测方式)和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能;
  • 它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助它实现各种各样的功能……

另外,从学习和就业方面来讲,Java的优势也是很明显的。Java在近些年的开发语言排行榜上始终在前三名中有一席之地。同样,从事Java开发的人员越多,总结的技术文档、录制的教学视频也是非常丰富的。不过针对网上海量的资源,初学者还是要多加筛选,切忌每种资料蜻蜓点水般的浏览。

2. Java语言重要特性

2.1 跨平台

(1)什么是跨平台:跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。在一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。

(2)Java跨平台实现原理:Java的跨平台是通过Java虚拟机(JVM)来实现的,不同的系统有不同的JVM版本。编译器(javac.exe)将源代码编译成字节码,字节码作为中间代码,它与特定机器码无关,需要特定机器的解释器(java.exe)转义后才能成为机器码,最后在对应的平台上运行。很多初学者以为Java开发的程序不依赖jre环境就可以在不同平台上运行,这是错误的)。

所以,Java语言本身与其它的编程语言没有特别大的区别,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言编写的程序运行的环境而已。

3. Java虚拟机

Java Virtual Machine 一个软件模拟的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java源程序编译后生成的字节码(.class)就相当于C源程序编译后的二进制可执行文件。JVM虚拟机相当于计算机系统(操作系统+硬件环境),Java解释器相当于CPU。(JVM将在后续文章中介绍)

Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序(Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令码)在该平台下运行,这是Java跨平台的根本。

4. 环境配置

很多初学者知道要配置环境,但是不知道为什么要配置环境配置。学好Java,不仅要知其然也要知其所以然,下面就讲讲为什么要配置环境变量。

4.1 配置Path环境变量

问题如果没有配置Path环境变量,要运行JDK中的应用程序必须定位到JDk的安装目录才能调用。
解决方案在环境变量中配置Path环境变量(C:\Program Files\Java\jdk1.8.0_161\bin由你的安装目录决定),配置之后就能在控制台窗口的任何目录下都可以调用javac与java或者jdk其他的开发工具。
原理在dos窗口上写上一个命令时候,如果在当前目录下找不到指定的可执行文件,那么它会根据path环境变量保存的路径去搜索是否存在这个可执行文件,如果存在则启动该程序,否则就没有这个命令(类似于notepad、calc等工具)。

这个其实很好理解,你也许知道在运行窗口中输入“notepad”或者“calc”就会快速调出记事本或者计算器。为什么呢?

你可以查看电脑上的Path环境变量,有下面的一项路径信息,可以通过这条路径定位到系统“system32”目录中。

%SystemRoot%\system32;//Path环境变量中的一项

在这个目录(C:\Windows\System32)中有“notepad.exe”和“calc.exe”两个应用程序,所以Path变量中保存的路径下的程序都可以通过这种方式访问到。

4.2 配置JAVA_HOME环境

问题有时候可能需要更换Jdk的目录,但是经常修改path的值可能会不小心修改其他的路径,导致某些程序不能正常使用。
解决方案在系统变量中添加一个JAVA_HOME,值为JDK的安装目录(bin的上一级目录),这时候Path环境变量的值可写成:%JAVA_HOME%/bin,以后需要更换JDK的目录时,只需要更换JAVA_HOME的目录即可。

4.3 配置Classpath环境

问题在执行class文件时,需要指定JVM加载类所在的路径
解决方案配置Classpath环境变量,如果在当前目录下找不到class文件,则到classpath环境变量保存的路径下搜索字节码文件。

4.4 设置临时环境变量

问题JDK有不同的版本,在编译或者运行某个java代码的时候,我想调用非Path路径下的其他版本的解释器(java.exe)或者编译器(javac.exe)。
解决方案配置Classpath环境变量,如果在当前目录下找不到class文件,则到classpath环境变量保存的路径下搜索字节码文件。
set:查看所有的环境变量信息。
set  变量名 :查看具体一个环境变量的值。
set  变量名= :清空一个环境变量的值。
set  变量名=具体值 :给指定变量定义具体值。
set  path=新值;%path% :在原有的环境变量上添加新值。

注意:这种配置方式只在当前dos窗口有效。窗口关闭,配置消失。

5. 相关面试

5.1  Java是解释执行吗?

(1)什么是编译执行、什么是解释执行?

  • 编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需重新编译。不过它是针对特定CPU体系的,这些目标代码只能在特定平台执行,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译。它不具备可移植性,但是执行速度快,C、C++这类语言属于编译型语言。
  • 将源语言直接作为源程序输入,解释一句后就提交计算机执行一句,并不形成目标程序。

(2)JVM默认都是采用混合执行模式

我们通常把Java分为编译期和运行时。这里说的Java的编译和C/C++是有着不同的意义的,Javac的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码。

问:为什么要将源码编译成字节码,而不是利用JVM直接解释源码?
答:理论上,完全可以直接解释源码,这样也可以跨平台。而引入字节码有额外的好处:
  • 直接执行字节码,比解释源码再执行,会更快。
  • 生成字节码过程中,编译器可以预先作语法错误或者安全性方面的检查,出错机会更少。
  • 字节码比源码更加紧凑,文件尺寸更小,方便网络传输。
  • 有些嵌入设备,不够资源跑起完整的编译器,这些设备只需要嵌入一个小巧的JVM就行了,在额外的平台上编译源码。
  • 字节码不一定非要java源码生成,其它一些语言比如scala也可以编译生成字节码。这样其它语言就可以利用上经过多年发展的JVM。

Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。

在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。就像我前面提到的,主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。Oracle Hotspot JVM内置了两个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如普通Java桌面应用;C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。这里不再展开更多JIT的细节,没必要一下子就钻进去,我会在后面介绍分层编译的内容。

(3)结论:

JVM可以加载字节码即.class文件,然后边翻译边执行,因而被称为解释型编程语言(但是解释的过程就是编译一条机器码执行一条,且JVM中存在即时编译器编译热点代码,所以也被成为半解释半执行的编程语言)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值