@TOC
JDK、JRE、JVM
JDK、JRE、JVM:
JDK是java开发工具包,包含JRE和java开发工具。JRE是java运行环境,包括JVM和核心类库。JVM是java虚拟主机,是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。
java开发工具(JDK):
- java用来运行一个.class文件(字节码文件)
- javadoc用来生成api文档
- jar用来生成jar包
- javac用来把.java文件(java源文件)编译为.class文件(字节码文件)
java核心类库(JRE):
- lang包:所有的封装类型(Integer,Double,Float,Boolean等)、Math、String、StringBuffer、System、Thread等等。
- util包:包括一些集合、事件等处理类,还有日期方面的类等等。
- IO包:传统的字节流、字符流以及相对于的封装类。
虚拟机(JVM):
- JVM是java字节码文件执行的引擎,还能优化java字节码文件,使之转化成效率更高的机器指令。
- JVM中类的装载是由类加载器和它的子类来实现的,类加载是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
- 不同的平台对应着不同的JVM,在执行字节码(class文件)时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台换将的机器指令并执行,这样就实现了跨平台运行。
JDK路径下目录:
JDK目录说明:
| 目录名称 | 作用 |
|---|---|
| bin目录 | 包含一些用于开发Java程序的工具,例如:编译工具(javac.exe)、运行工具 (java.exe) 、打包工具 (jar.exe)等。 |
| db目录 | 纯Java开发的数据可 Derby,是一个开源的100%Java开发的关系数据库。 |
| include目录 | C语言的头文件,用于支持Java程序设计。 |
| jre目录 | Java运行时环境的根目录。 |
| jre\bin目录 | 包含Java平台所使用工具和类库的可执行文件和DLL文件。 |
| jre\lib目录 | Java运行时环境所使用的核心类库。 |
| lib目录 | 包含开发Java程序所使用的类库文件,主要包括tools.jar和dt.jar。 |
| src.zip | 归档的Java源代码 |
JDK中rt.jar、tools.jar和dt.jar作用:
| jar包名称 | jar包目录 | jar包作用 |
|---|---|---|
| rt.jar | {Java_Home}/jre/lib/ | JAVA基础类库,也就是你在java doc里面看到的所有的类的class文件 |
| dt.jar | {Java_Home}//lib/ | 运行环境的类库 |
| tools.jar | {Java_Home}//lib/ | 工具类库,编译和运行需要的都是toos.jar里面的类分别是sun.tools.java.*; sun.tools.javac.* |
JRE下的LIB和JDK下的LIB的区别:
- jre是JDK的一个子集。提供一个运行环境。
JDK的lib目录是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。JRE的lib目录是为JVM,运行时候用的。包括所有的标准类苦,和扩展类。
java开发中,项目或者jvm是怎么找到lib下的jar的?
那都是 ClassLoader 的子类实现的,不仅仅可以在特定的文件夹去加载,而且还可以通过网络或Http远程加载jar,比如URLClassLoader。- 又比如 Web 项目,一般jar会放在WEB-INF/lib,那么这个又是特殊的 ClassLoader 实现,它会自动找这个目录的jar,并加载它。
详细可以看API文档 java.lang.ClassLoader!
语言分类
语言分类简介:
- 从抽象级别上分,编程语言可以分为机器语言、汇编语言和高级语言。
①第一代语言是
机器语言,以二进制代码形式存在。 ②第二代语言是汇编语言,使用助记符来表示一条机器指令。 ③第三代语言是高级语言。 - 高级语言根据其构建可执行程序的过程分,又可分为
编译型语言,解释型语言和混合型语言。 ①编译型语言,如C++ ②解释型语言,如Python ③混合型语言,如Java.它先编译成字节码(中介位码),然后字节码在JVM上解释执行
脚本语言:
脚本语言,通常指的就是解释型语言。- 其特点是你写出来的代码是动态被载入、解释、执行的,就好像是你在编写舞台的剧本,让机器这个演员随着你的剧本演出,你可以随时变更你的想法,决定下一步机器应该做什么。这种动态的、可运行时扩展的特性,以及不用编译的便捷性,使得用脚本语言开发程序尤为迅速。
- 现在脚本语言已经广泛用于当今互联网的每一个角落,比如
前端的JavaScript,后台的PHP,敏捷开发中特别是AI原型程序开发中的Python。就连游戏里面也存在大量脚本,技能的释放、NPC对话过程、表情动作也大多由脚本语言lua编写。
解释和翻译的区别:
- 与计算机的交流方式不同
①
解释程序不产生目标代码,它逐条地取出源程序中的语句,边解释,边执行;解释器把源代码文件边解释成机器语言边交给CPU执行。②编译是将源程序翻译成可执行的目标代码,执行可执行程序文件,翻译与执行是分开的。 - 运行环境不同
①
解释程序可跨平台使用,因为解释器已经做好了对不同平台的交互处理,用户写的源代码不需要再考虑差异性,源代码所有平台都可以直接执行。 ②编译程序跨平台性不好,不同操作系统,调用底层的机器指令不同,需为不同平台生成不同的机器码文件。 - 开发便捷性
①
解释程序可以随时修改,立刻生效,改完源代码后,直接运行看效果②编译程序每次修改源代码,都要重新编译,生成机器码文件 - 运行速度
①
解释程序运行效率低,所有的代码均需经过解释器边解释变执行,速度比编译型慢很多 ②编译程序执行速度快,因为你的程序代码已经翻译成了是计算机可以理解的机器语言。
为什么Java可以跨平台?
- 语言编译后,在不同平台上的机器码是不同的,比如说:在Windows上可能是0101,到了Linux系统上可能是1010了。
- java语言有所不同,因为java编译后,生成的是
中介位码(.class文件)。 中介位码并没用直接翻译成平台上的机器码,而是形成了一座桥梁,位于java编程语言与操作系统之间。这样java语言只负责便于为(.class)文件,而不用去关心中介位码如何翻译成机器码的。这样的一座桥梁就实现的java语言的跨平台。
反编译
简介:
- 计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。
- 反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。
什么时候会用到反编译?
我们只有一个类的class文件,但是我们又看不懂Java的class文件,那么我们可以把它反编译成我们可以看得懂的文件。学习Java过程中,JDK的每个版本都会加入越来越多的语法糖,有些时候我们想知道Java一些实现细节,我们可以借助反编译。
反编译工具:
- javap
- Jad
面向对象/面向过程和Java/C
面向对象/面向过程简介:
- 面向对象和面向过程是一种编程思想,
面向过程指的是做事情以过程为主体,一步一步地实现。而面向对象是以个体为主体,从个体出发去实现个体想做的事情。- 面向过程的代表性语言有C语言,而面向对象的代表性语言是Java,
- C语言主要应用在实现操作系统的底层架构时,因为实现架构时面对的不是一个个个体,而是过程,所以C语言具有开发效率低但运行效率高的特点,
- 而在上层应用中则对应我们需要现实生活,如客户在商家的店铺里买商品,这是运用java语言则开发效率高,但运行效率跟C语言比比较低。
- 此外,面向对象有两个要素:类和对象,三个特性:封装,多态,继承。
Java/C简介:
- java跟c的区别在于 java多了两个核心机制:
①
JVM:java虚拟机,对于不同的平台,有不同的虚拟机,因此java语言可以跨平台编译。②垃圾回收:在C中不再使用的内存空间,用户需要手动实现回收机制,但在Java中,它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。提高语言的健壮性。 此外Java引用和C指针的区别:①引用是值为地址的数据元素,而指针是一个装地址的变量;②引用是有类型的,其类型转换可能不成功,指针只是一个地址; ③引用的初始值是null,指针的初始值不一定; ④引用不能直接计算,指针可以计算跳转;⑤引用不用主动回收,指针需要主动回收。
C、C++和C#区别概述
C语言:
- 我们从C语言开始讲起,因为它是三者中最老的、使用范围最广的语言。Dennis Ritchie在1972年创造了C语言并在1978年公布。Ritchie设计C的初衷是用于开发新版本的Unix。
- 在那之前,Unix使用的是汇编语言(assembly language),它是计算机可读取的最低级的编程。C语言的诞生彻底改变(revolutionize)了编程和操作系统。其余的,正如他们所说,是一段历史了。
- (eg:
语言的低级或者高级,并不是说语言的厉害程度。低级指的是更加接近于底层,计算机执行起来更快但是不利于人类理解,高级则相反。) - C也是一门低级的编程语言,它的效率和汇编接近。它提供了基本级(base-level)的访问内存方式,对运行时支持的要求非常小。
- 尽管它已经诞生了40多年,但是它依然得到广泛的使用。开发人员仍然使用它在操作系统、内核级软件开发、硬件驱动和需要与旧代码一同工作的应用程序上。
C++语言:
- C++是作为C的扩展来开发的。它是由丹麦的哲学博士(Ph.D.)Bjarne Stroustrup开发的。
他的目标是增强C语言并在不牺牲速度和效率的前提下为其增加面向对象(object-oriented)的能力。 C++被认为是一种中级的语言,因为它基于低级的C语言所创建并拥有一些高级的能力。- 自从1985年其发布以来,它已成为了另一个高产的编程语言。在开发操作系统时它会和C一同协作,但是在一些high-profile服务器和PC软件上也能看到它的身影。
- (eg:high-profile,可以理解为高调的意思,例如游戏PC领域的雷蛇、外星人系列。)
C#语言(发育:CSharp):
C#是一门高级的面向对象的编程语言,同样也是作为C的扩展所创建的。它是在2002年,由微软的一个团队的领头人Anders Hejlsberg开发的。它是基于.NET框架的,但是它的核心依然是C语言。C#将代码编译成字节码(byte-code)而不是机器码(0101的二进制)。这意味着它会在一台虚拟计算机上运行,这台虚拟机实时(on the fly)将字节码翻译成机器码。它在C语言的基础上添加了垃圾回收(garbage collection)、未初始化的变量检查(uninitialized variable checking)、边界检查(bound checking)和类型检查(type checking)这些特性。- eg:
这里的时候联想到了Java以及JVM。 - C#常见于内部或者企业应用而不是商业软件。可以在.NET框架中的客户端和服务器端开发中找到。
- 虽然C#是三门语言中技术上最复杂的,但是它的语法相对于C和C++来说更不容易出错,因此相对来说它的学习会更快点。
go, scala和java区别
scala语言:
- Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 运行在Java虚拟机上,并兼容现有的Java程序。- Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。
Go语言:
Go(又称 Golang)是 Google 公司开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
链接:
.NET与JAVA的区别
区别:
- .NET与Java的这种相似为网站管理系统的开发提供了便利,如果您掌握了C#,那么,掌握Java这个语言几乎是不费什么力气的,需要花费时间的只不过就是熟悉彼此的类库。
①
.NET是.NET Framework,Java是J2SE。②学习这两者的理论基础都是面向对象理论。所以,一名有着面向对象理论基础的人是很容易掌握.NET和Java的。 -
.NET是微软推出的一种新的软件运行平台,它包括一整套应用范围广泛的技术,旨在迎接Java所带来的挑战。 ①.NET给网站管理系统开发带来了很多新的技术,尤其是它的“混合语言”开发方式,是第一个支持多种语言混合开发的软件运行平台,下一代Windows--LongHorn的核心将会看到.NET的身影。 ②如果读者学过Java,那么您会发现,.NET与Java实在是太象了。尤其是C#,如果给你一段代码,有的时候还真难分辨出是用Java还是C#写的。 - Java是上世纪九十年代诞生的一种面向对象语言,它吸取了C++的许多长处,其最大的特性是“跨平台”,由于它很好地满足了网络时代信息系统对高级语言的要求,因而在实践中得到广泛应用。Java经过近十年的发展,目前已在企业信息系统开发领域占据了主流地位,形成了一整套完整的技术体系,取得了巨大的成功。
- JAVA平台包括JAVA语言,以及一套虚拟机——如JVM、KVM、CVM等——通过它们实现在PC机,手提电脑或是嵌入式系统上运行JAVA的字节码。
①
同时,JAVA平台还定义了一整套覆盖面很广的API,它们被用来与微软的API协调或是相互竞争。如JDBC对ODBC,JTAPI对TAPI,JDO对ADO等等。②因此,简要来说,JAVA平台包括语言,虚拟机,以及API库。由于使用虚拟机机制,所以JAVA语言在所有的平台上只有唯一的版本, ③因此它使用RMI协议进行远程通信;微软则在.NET框架中使用DCOM——正在逐步演变为SOAP。SUN最初对JAVA的宣传是“一次性代码编写,所有环境下运行”,但在推出了“J2EE”和“J2ME”后不得不收回了它最初的宣传,因为“一种尺码的鞋适合所有的脚”的解决方案并不能很好的工作。 .NET框架包括C++, VB.NET和C#等一系列语言与JAVA虚拟机类似的一套运行时环境以及一套倾向与WINDOWS体系的API接口。①其中的运行时环境可能存在于一个浏览器、或是一个WEB SERVER、或是在操作系统中。将来也许在SQL SERVER中也可能存在这样的运行时环境。 ②另外需要提及的是微软的SOAP协议,它在继承了DCOM的一些特性的基础上发展起来,基于XML格式通过HTTP进行传输。
注释
简介:
- 注释分为单行注释,多行注释以及文档注释。
①单行注释主要应用在方体里的中的代码。
②多行注释主要应用在方体里的中的代码。
③
文档注释主要应用在方法前和类前,属性前和构造器前。注释的内容可以被java开发工具javadoc解析生成一个以网页形式体现的该程序的说明文档。
常用的DOS命令
简介:
dir: 列出当前目录下的文件以及文件夹md: 创建目录rd: 删除目录cd: 进入指定目录cd..: 退回到上一级目录cd\: 退回到根目录del: 删除文件exit: 退出 dos 命令行- 补充:echo javase>1.doc
- 常用快捷键 ① ← →:移动光标 ② ↑ ↓:调阅历史操作命令 ③ Delete和Backspace:删除字符
path
定义:
- 环境变量分为用户变量和系统变量: ①系统变量对于所有用户都有效 ②用户变量对于当前用户有效
- path环境变量:windows系统要执行命令时要搜寻的路径
解释:
- 一般来说需要执行java开发工具,只能在jdk的bin目录下才能执行,当你配置了path环境变量后,则可以在任意目录下运行java开发工具。
- (因为当你执行命令时系统会在当前路径下寻找执行命令,当找不到时,系统则会去path这个环境变量的路径里取找执行命令)
classpath
定义:
- classpath 顾名思义就是类路径。
设置方法:
- SET CLASSPATH = 路径
- SET CLASSPATH = . (一个点) 相当于设置在当前所在目录加载类文件(设置到系统变量中比较好)
作用:
- 配置过CLASSPATH环境后,java命令是按照CLASSPATH变量中的路径来的寻找class文件的,不需要必须定位到java.class文件所处的路径就可以运行java.class。
- 未设置classpath环境的时候,因为如果HelloWorld不在C盘,在C盘执行命令。那么会显示错误,说找不到或无法加载主类,必须定位到其所在的文件中才能进行运行。
总结:
- 当设置了CLASSPATH之后,JAVA程序解释的时候会自动通过CLASSPATH所设置的路径进行类的加载,
- 所以可以得出一个结论:JVM解释程序的时候需要得到CLASSPATH的支持。默认情况下所有解释的类都是从当前所在目录的加载的,
- 所以可以得出一个结论:CLASSPAT默认设置为当前所在目录加载类文件。很明显如果到处去设置CLASSPATH就会造成整个系统操作的混乱,那么从正常的角度来讲对于CLASSPATH还是应该采用默认设置方式。
classpath时lib中的rt.jar ,dt.jar ,tool.jar有什么用?
- dt.jar是关于运行环境的类库,主要是swing的包。
- tools.jar是关于一些工具的类库。
- rt.jar包含了jdk的基础类库,也就是你在java doc里面看到的所有的类的class文件。
classpath时lib中的rt.jar ,dt.jar ,tool.jar有什么用?
path和classpath的关系
区别:
- PATH:是操作系统提供的路径配置。提供windows命令行中java指令的可执行文件路径,当我们在命令行中键入指令时,根据环境变量中的path值,找到对应的指令可执行文件进行执行
- CLASSPATH:是JRE提供的,是用于定义Java程序解释时类加载路径,默认设置为当前所在目录加载。可以通过“CLASSPATH =路径”的命令形式来进行定义。
- 关系:JVM→CLASSPATH定义的路径→加载字节码文件。 path和classpath的作用
环境变量
总结:
- 在安装一个软件时,有些软件必须安卓环境变量,有些则不用。
- 如JDK必须安装环境变量:CLASSPATH和PATH,而Tomcat和Mysql如果想在任何地方都可以使用软件服务则需要安装环境变量。(因为JAVA工作目录不可能在JDK的bin目录下创建)
- 此外有些软件还依靠另外一些软件的环境变量。如Maven依靠JDK的环境变量,因此环境变量的命名是有规范的,如JDK的JAVA_HOME。若Maven找不到此环境变量则不可运行。
API和SDK
SDK是什么?
- SDK 就是 Software Development Kit的缩写,翻译过来——软件开发工具包。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做SDK。
- SDK被开发出来是为了减少程序员工作量的。
API和SDK的区别:
- 总的来说,两者没有值得比较的区别,因为是具有关联性的两种东西。
你可以把SDK想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,只有一个小小接口可以联通外界,这个接口就是API。- 所以:
①
SDK=放着你想要的软件功能的软件包②API=SDK上唯一的接口