Java语言的发展简史
- 1995年 Sun推出java.
- 1996年Sun发布JDK1.0.这个版本包括两部分:运行环境(即JRE)和开发环境(JDK).
JRE包括①核心API②集成API③用户界面API④发布技术⑤java虚拟机(JVM)
JDK包括:编译java程序的编译器(javac) - 1997年发布JDK1.1。 JDK1.1增加了JIT(即时编译)编译器。
**note:**问JIT编译和其他编译器的区别
答:传统编译器是编译一条,运行完成后将其扔掉;JIT会将常用的指令保存在内存中,当下次调用时就不需要重新编译了,通过这种方式让JDK在效率上有了较大提升。 - 1998年Sun发布了JDK1.2。同时发布了Servlet/JSP,EJB等规范。将Java分成了J2EE、J2SE和J2ME三个版本。
J2ME:主要用于控制移动设备和信息家电等有限存储设备。
J2SE:整个Java技术的核心和基础。
J2EE:JAVA技术中应用最广泛的部分,J2EE提供了企业应用开发相关的完整解决方案。
**note:**JDK1.2还把它的API分成三大类。
核心API:由Sun公司制定的基本API,所有的JAVA平台都提供。
可选API:这是Sun为JDK提供的扩充API,这些API因平台的不同而不同。
特殊API:用于满足特殊要求的API。如用于JCA和JCE的第三方加密类库。
java程序运行机制
高级语言的运行机制
- 计算机高级语言按程序的执行方式可以分为编译型和解释型两种。
- 编译型语言:指使用专门的编译器,针对特定的平对(操作系统)将某种高级语言代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(compile)。编译生成的可执行性程序可以脱离开发环境,在特定的平台独立运行。
解释型语言指专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链家处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。·
可以认为:每次执行解释型语言的程序都需要进行一次编译,因为解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言由一个优势:跨平台比较容易,只需要提供特定的平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。
java语言的运行机制和JVM
JAVA语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成与平台无关的字节码(也就是*.class文件)。这种字节码不是可执行文件,必须使用Java解释器莱解释执行。
java 语言里负责解释型执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编译相同的编程接口,而编译器只需要向面向虚拟机,生成虚拟机能理解的代码,然而又虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。
当使用Java编译器编译Java程序时,生成的时与平台无关的字节码,这些字节码不面向任何具体跨平台,只面向JVM。不同平台上的JVM都是不同的,但它们都是提供了相同的接口。JVM是JAVA程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的JAVA字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间转换器才可以实现JVM就是这个转换器。
JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和存储器。
开发Java的准备
下载和安装JDK
JDK安装路径和文件路径
bin:该路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该路径下。
conf:该路径下存放了JDK的相关配置文件。
incluede:存放一些平台特定的头文件。
jmods:该目录下存放了JDK的各种模块。
legal:该目录下包含了JDK的各种模块。
lib:该路径下存放的是JDK工具的一些补充JAR包。比如src.zip文件中保存了JAVA的源代码。
README和COPYRIGHT等说明性文档。
设置PATH环境变量
编译和运行Java程序必须经过两个步骤。
①将源文件编译成字节码
②解释执行平台无关的字节码程序
不管Linux平台还是windows平台,只需要把java和javac两个命令所在的路径添加到PATH环境变量中,就可以编译和运行Java程序。
在Linux上设置环境变量
进入当前用户的home路径下,然后在home路径下输入如下命令:
ls -a
该命令将列出当前路径下所有的文件,包括隐藏文件,Linux平台的环境变量是通过.bash_profile文件来设置的。使用无格式编辑器打开该文件,在该文件的PATH变量后添加:/home/JDK/bin,修改后的PATH变量设置如下:
# 设置PATH环境变量
PATH=.:$PATH:$HOME/bin:/home/jdk/bin
Linux平台和Windows平台不一样,多个路径之间以冒号(:)作为分隔符,而$PATH则用于引用原有的PATH变量值。
完成PATH变量值的设置后,在.bash_profile文件最后添加导出PATH变量的语句,如下所示
# 导出PATH环境变量
export PATH
重新登陆Linux平台,或者执行如下命令:
source .bash_profile
第一个Java程序
编辑Java源代码
编辑java源代码可以使用任何无格式的文本编译器,在windows操作系统上可使用记事本(NotePad)、EditPlus等程序,在Linux平台上可使用VI工具等。
在记事本中新建一个文本文件,并在该文件中输入如下代码
public class HelloWorld
{
//Java程序的入口方法,程序将从这里开始执行
public static void main(String[]args)
{
//向控制台打印一条语句
System.out.println("Hello World");
}
}
编译Java程序
编译Java程序需要使用Javac命令,因为前面已经把javac命令所在的路径添加到了系统的PATH环境变量中,因此现在可以使用JAVAC命令所在的路径添加到了系统的PATH环境变量中,因此现在可以使用Javac命令编译Java程序了。
如果直接在命令行窗口里输入Javac,不跟任何选项和参数,系统将会输出大量提示信息,用以提示Javac命令的用法。
javac命令如下用法
javac -d destdir srcFile
在上面命令中,-d destdir 是javac命令的选项,用以指定编译生成的字节码文件的路径,destdir只需要是本地磁盘上的一个有效路径即可;而srcFile是Java源文件所在位置,这个位置即可以是绝对路径,也可以是相对路径。
通常,总是将生成的字节码文件放在当前路径下,当前路径可以用点(.)来表示。在命令行窗口
javac -d . HelloWorld.java
根据CLASSPATH环境变量定位类
在使用1.5以上的版本的JDK,完全不用设置CLASSPATH环境变量。
问:CLASSPATH环境变量的作用是什么呢?
答:当使用“java Java类名”命令来运行Java程序,JRE到哪里去搜索Java类呢?可能回答,在当前路径下搜索。但在1.4以前版本JDK都没有设计这个功能,这意味着即使当前路径下已经包含了HelloWorld.class,并在当前路径下执行“java Hello World”,系统将一样提示找不到Hello World类。
如果使用1.4以前的版本的JDK,则需要JDK的lib路径下dt.jar和tools.jar文件中的Java类,因此还需要把这两个文件添加到CLASSPATH环境变量里。
因此在使用1.4以前的版本的JDK来编译和运行Java程序,常常需要设置CLASSPATH环境变量的值为.,%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(其中%JAVA_HOME%代表JDK的安装目录)
如果想在运行java程序时临时指定JRE搜索Java类的路径,则可以使用-classpath选项(或用-cp选项,-cp是简写,作用完全相同)如按以下格式来运行java命令:
java -classpath dir1;dir2;dir3...;dirN Java类
-classpath 选项的值可以是一系列的路径,多个路径之间windows平台上以分号(;)隔开,在Linux平台上则以冒号(:)隔开。
如果在运行Java程序时指定了-classpath选项的值,JRE将严格按-classpath选项所指定的路径来搜索Java类,即不会在当前路径下搜索Java类,CLASSPATH环境变量所指定的搜索路径也不再有效。
如果想使CLASSPATH环境变量指定的搜索路径有效,而且还会在当前路径也下搜索Java类,则可以按如下格式来运行Java程序:
java -classpath %CLASSPATH%;.;dir1;dir2;dir3...;dirN Java 类
上面命令通过%CLASSPATH%来引用CLASSPATH环境变量的值,并在-classpath选项的值里添加了一个点,强制JRE在当前路径下搜索Java类。
java程序的基本规则
java程序的的组成形式
Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
Java解释器规定:如需某个类能被解释器直接解释执行,则这个类里必须包含mian方法,而且main方法必须是public static void来修饰,且mian方法的形参必须是字符串数组类型(String[]args 是字符串数组的形式)。也就是说,main方法的写法几乎是固定的。Java虚拟机是从这个main方法开始解释执行,因此,main方法是Java程序的入口。
对于那些不包含main方法的类,也就是有用的类,对于一个大型的Java程序而言,往往只需要一个入口,也就是只有一个类包含main方法,而其他类都是用于被main犯法直接或间接调用的。
java源文件命名规则
- java程序源文件的扩展名必须是.java,不能是其他文件扩展名。
- 在通常情况下,Java程序源文件名可以是任意的,但有一种情况例外:如果Java程序源代码里定义一个public类,则该源文件的主文件名必须与该public类(也就是该类定义使用public关键字修饰)的类名相同。
由于Java源程序文件的文件名必须于public类的类名相同,因此。一个Java源文件里最多只能定义一个public类。 - 一个Java源文件只定义一个类,不同的类使用不同的源文件定义。
- 让Java源文件的主文件名于该源文件中定义的public类同名。