前言
万丈高楼平地起,没有扎实的技术基础注定不会走太远。以前自认为具有多年的开发经验,早就对Java基础知识已经掌握得炉火纯青。但是在面试的时候,面对面试官刨根问底的提问,总是回答得模棱两可,甚至直接说对某某知识点不太了解,这样的面试结果总是差强人意的。
要想在技术的路上走得更远,更深,还是要踏踏实实的掌握基础的知识,并在原来的知识储备上有所提升。
《Java基础回炉》这一文集将从Java语言的基本特性和机制开始向具体项目开发推进,将碎片知识系统化,巩固Java技术功底,达到“知其然也知其所以然”的目的,在后面的求职面试中从容面对面试官刨根问底般的暴击,更重要的是在实际的开发工作中能快速定位问题之所在和找到解决方案。
文集目录
Java基础回炉和提升暨文集开篇
深入类和对象——Java基础回炉(二)
java接口及其新特性——Java基础回炉(三)
1. Java概述
我们经常说学习java,有些新人总以为学习了java语言就算是掌握了java。实际上Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
1.1 Java技术体系
(1)广义上讲,运行于Java虚拟机上的语言(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.*的包名。
(3)Java基础学习领域划分
以上的分类,我们只要了解就可以了,我们更关心的是在学习Java的过程中,划分了哪些学习领域。
由于我们这一系列文章是针对Java基础的回顾和提升,所以在这里用一张图展示Java基础所涉及的东西,在后面的文章中也是对其中一些比较容易出面试问题的点做出总结:
1.2 关键术语
- JDK(
Java Development ToolKit
):Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境(开发人员需搭建的环境,语言+api+JVM)。 - JRE(
Java Runtime Environment
):Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境(如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可,JVM+API)。 - JVM(
Java Virtual Mechinal
):。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。
2. Java语言重要特性
2.1 Java优点
Java的诞生已经超过了20年,一直以来,它以优秀的特性吸引了无数程序员学习和使用,各大公司对Java工程师的需求也是源源不断。下面优点是它风靡的原因之一:
- 它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;
- 它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;
- 它实现了热点代码检测(采样热点监测和计数监测方式)和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能;
- 它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助它实现各种各样的功能……
另外,从学习和就业方面来讲,Java的优势也是很明显的。Java在近些年的开发语言排行榜上始终在前三名中有一席之地。同样,从事Java开发的人员越多,总结的技术文档、录制的教学视频也是非常丰富的。
不过针对网上海量的资源,初学者还是要多加筛选,切忌每种资料蜻蜓点水般的浏览。
2.2 跨平台
(1)什么是跨平台:跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。在一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。
(2)Java跨平台实现原理:Java的跨平台是通过Java虚拟机(JVM)来实现的,不同的系统有不同的JVM版本。编译器(javac.exe)将源代码编译成字节码,字节码作为中间代码,它与特定机器码无关,需要特定机器的解释器(java.exe)转义后才能成为机器码,最后在对应的平台上运行。(很多初学者以为Java开发的程序不依赖jre环境就可以在不同平台上运行,这是错误的)。
所以,Java语言本身与其它的编程语言没有特别大的区别,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言编写的程序运行的环境而已。
3. 环境配置
在我们刚开始学习Java时,老师说让我们先要配置好环境变量。很多初学者能够按照老师的步骤配置好环境,但是却不知道为什么要配置环境配置。学好Java,不仅要知其然也要知其所以然,下面就讲讲为什么要配置环境变量。
3.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环境变量,有这条路径信息%SystemRoot%\system32;
,可以通过这条路径定位到系统“system32”目录中。在这个目录(C:\Windows\System32
)中有许多exe
执行文件,包括“notepad.exe”
和“calc.exe”
两个应用程序,所以Path变量中保存的路径下的程序都可以通过这种方式访问到。
3.2 配置JAVA_HOME环境
问题 | 有时候可能需要更换Jdk的目录,但是经常修改path的值可能会不小心修改其他的路径,导致某些程序不能正常使用。 |
---|---|
解决方案 | 在系统变量中添加一个JAVA_HOME,值为JDK的安装目录(bin的上一级目录),这时候Path环境变量的值可写成:%JAVA_HOME%/bin,以后需要更换JDK的目录时,只需要更换JAVA_HOME的目录即可。 |
3.3 配置Classpath环境
问题 | 在执行class文件时,需要指定JVM加载类所在的路径 |
---|---|
解决方案 | 配置Classpath环境变量,如果在当前目录下找不到class文件,则到classpath环境变量保存的路径下搜索字节码文件。 |
3.4 设置临时环境变量
问题 | JDK有不同的版本,在编译或者运行某个java代码的时候,我想调用非Path路径下的其他版本的解释器(java.exe)或者编译器(javac.exe)。 |
---|---|
解决方案 | 配置Classpath环境变量,如果在当前目录下找不到class文件,则到classpath环境变量保存的路径下搜索字节码文件。** |
我们可以用set命令设置环境变量:
set:查看所有的环境变量信息。
set 变量名 :查看具体一个环境变量的值。
set 变量名= :清空一个环境变量的值。
set 变量名=具体值 :给指定变量定义具体值。
set path=新值;%path% :在原有的环境变量上添加新值。
注意:这种配置方式只在当前dos窗口有效。窗口关闭,配置消失。
4. 面试相关
在每篇文章的最后一个部分,我通常会根据本文涉及的内容整理一些在面试过程中可能会被问到的问题,希望通过以这种以练促学的方式加深对知识的理解。
4.1 Java是解释执行吗?
在回答这个问题之前,我们得先掌握一些知识:
(1)什么是编译执行、什么是解释执行?
- 编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需重新编译。不过它是针对特定CPU体系的,这些目标代码只能在特定平台执行,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译。它不具备可移植性,但是执行速度快,C、C++这类语言属于编译型语言。
- 解释执行是将源语言直接作为源程序输入,解释一句后就提交计算机执行一句,并不形成目标程序。
(2)Java源代码到能被机器执行的机器码经历了什么?
我们通常把Java分为编译期和运行时。
编译期,是将Java的源代码,通过Javac编译成为字节码(bytecode),然后,在运行时,通过 Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。
但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
看到这里我们基本上就能回答这个面试问题了。我在学习的时候,还有过下面的疑问:
(3)为什么要将源码编译成字节码,而不是利用JVM直接解释源码?
这里说的Java的编译和C/C++是有着不同的意义的,Javac的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码。
那我们为什么不直接利用JVM解释源码?
其实,理论上,完全可以直接解释源码,这样也可以跨平台。而引入字节码有额外的好处:
- 直接执行字节码,比解释源码再执行,会更快。
- 生成字节码过程中,编译器可以预先作语法错误或者安全性方面的检查,出>错机会更少。
- 字节码比源码更加紧凑,文件尺寸更小,方便网络传输。
- 有些嵌入设备,不够资源跑起完整的编译器,这些设备只需要嵌入一个小巧的JVM就行了,在额外的平台上编译源码。
- 字节码不一定非要java源码生成,其它一些语言比如scala也可以编译生成字节码。这样其它语言就可以利用上经过多年发展的JVM。
综上,说Java是解释执行是不正确的,JVM中的解释器却是在解释执行,但是JVM中同时存在JIT,它能及时编译热点代码。
所以也被称为半解释半执行的编程语言。以一图以蔽之:
5. 总结
这篇文章概述了Java技术体系、关键术语、Java的优点、环境的配置等内容,目的是提纲挈领地构建一个整体的印象。接下来就对其中的面试热点内容做个整理,希望对你也有帮助。
网友评论