java知识入门

148 阅读19分钟

@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上唯一的接口