1、java相关概念
1>JDK:Java Develop Kit,Java开发工具包
2>JRE:Java Runtime Enviroment,Java 运行环境,通常已包含在J2SDK中。如果仅仅是为了运行java程序,而不是从事java开发,可以直接安装JRE。
2、java的开发工具包
1>J2SE(Java 2 Platform,Standard Edition):用于桌面开发
2>J2EE(Java 2 Platform,Enterprise Edition):用于企业级开发
3>J2ME(Java 2 Platform,Micro Edition):用于手机开发
3、java的起源:
Java来自sun工具的一个叫Green的项目,其原先目的是为家用电子产品开发一个分布式代码系统,这样我们可以把E-mail发给的冰箱,电视机等家用电器,对它们进行控制,和它们进行信息交流。开始准备采用C++,但C++太复杂,最后基于C++开发了一种新的语言Oak(java的前身),Oak是一种用户网络的精巧而安全的语言,Sun公司曾为此投标一个交互式电视项目,但被SGI打败。可怜的Oak几乎无家可归,恰巧这时Mark Ardreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用java编制了HotJava浏览器,得到了sun公司首席执行官scott McNcaly的支持,出发了Java进军Internet。java的取名来源于Java(爪哇)咖啡。
4、java的特性
1>简单的:
java的风格类似于C++,从某种意义上讲,java语言是C及C++的一个变种;
java摒弃了C++中容易引发程序错误的特性,如指针,结构,枚举以及内存管理;
java提供了丰富的类库,可以帮助我们方便的开发java程序;
2>面向对象的
java是完全面向对象的语言,支持继承,重载,多态等面向对象特性;
3>健壮的
java致力于检查程序在编译和运行时的错误;
java是一种强类型语言,其类型检查比C++严格,类型检查帮助我们检查出许多开发早起出现的错误;
java自己负责内存管理,提示了垃圾内存回收机制,有效的避免了C++中最头疼的内存泄露问题;
4>安全的
java语言删除了指针和释放内存等C++功能,避免了非法内存操作;
java的安全体系架构确保java代码的安全性,当我们从网上下载java代码在本地执行时,java安全架构能确保恶意的代码不能随意访问我们本地计算机的资源,如删除文件,访问本地网络资源等操作都是禁止的;
5>解释的
java代码是解释执行的,使用java编译器将java代码编译成字节码,这是一种中间代码,然后由java解释器解释执行;而C++程序师编译执行的,C++程序代码被编译为本地机器指令,然后执行;
6>与平台无关的
一次编译,处处运行;java作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式;只要有java运行系统的机器都能执行这种中间代码;java源程序被编译成一种与机器无关的字节码格式,在java虚拟机上运行;
7>多线程的
多个线程同时运行,提高效率;
8>动态的
java的动态特性是其面向对象设计方法的扩展;它允许车程序动态地装入运行过程中所需要的类,这是我们采用C++语言进行面向对象程序设计所无法实现的。在C++程序设计中,每当在类中增加一个实例变量或一个成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再有解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可全速执行;在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中的另一系统中的某一类,该类的所有者也可以自由的对该类进行更新,而不会使任何引用该类的程序崩溃;
java还简化了使用一个升级的活全新协议的方法,如果你的系统运行java程序时遇到了不知怎样处理的程序,java能自动下载你所需要的功能程序。
5、java跨平台的原理
java的跨平台是通过java虚拟机(JVM)来实现的;
1>java源文件的编译过程:
java应用程序的开发周期包括编译、下载、解释和执行几个部分;java编译程序将java源程序编译为JVM可执行的代码——字节码;这一编译过程同C/C++的编译有所不同;当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的;因此,在编译过程中,编译程序通过查表将所有对富豪的引用转换为特定的内存偏移量,以保证程序的运行;java编译器却不将变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创建内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效保证了java的可移植性和安全性。
2>java解释器的执行过程:
运行JVM字节码的工作由解释器来完成。解释执行分三步进行:代码的装入、代码的校验和代码的执行。
装入代码的工作由类装载器(classloader)完成,类装载器负责装入运行一个程序所需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他方法可以影响其他类。在本台计算机上的所有类都在同一地址空间中,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证他们与外部引用的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定可执行程序的内存布局。解释器为符号引用同特定的地址空间简历对应关系及查询表。通过在这一阶段确定代码的内存布局,java很好的解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问;
随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型等多种错误,通过校验后,代码便可执行了。
3>java字节码的两种执行方式
第一种:即使编译方式,解释器先将字节码编译成机器码,然后再执行该机器码;
第二种:解释执行方式:解释器通过每次解释执行一小段代码来完成java字节码程序的所有操作;
通常采用的是第二种方法。由于JVM规则扫描具有足够的灵活性,这使得将字节码翻译为机器码的工作具有较高的效率,对于那些对运行速度要求较高的应用成,解释器可将java字节码及时编译为机器码,从而很好的保证了java代码的可移植性和高性能;
4>JVM规格描述
JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵活性,同时也确保java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别的是对java可执行代码,及字节码的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标示符的数值表示方式以及java类文件中的java对象、常量缓冲池在JVM的存储映像。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。java的设计者希望给开发人员以随心所欲使用java的自由;
JVM是为java字节码定义的一种独立于具体平台的规格描述,是java平台独立性的基础。
5>java程序执行与C/C++程序执行的对比分析
如果把java源程序想象成我们的C++源程序,java源程序编译后生成的字节码就相当于源程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,java解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在java解释器上运行的是java字节码。
java解释器实际上就是特定平台的一个应用程序。只要实现了特定平台下的解释器程序,java字节码就能通过解释器程序在该平台下运行,这是java跨平台的根本。当前,并不是所有的平台下都有相应的java解释器程序,这也是java并不能在所有的平台下都能运行的原因,它只能在已实现了java解释器程序的平台下运行。
6、编辑器:UltraEdit
在linux下,换行由一个字符组成,ascii码为10;
在windows下,换行由两个字符组成,即回车换行,ascii码为13,10;
记事本中将换行10解释为小黑块,在UltraEdit中打开会提示转换。
7、编译java源文件
1、将javac拖动到运行窗口打开行中或命令提示符窗口中,可以直接执行javac命令。
2、添加环境变量:
1>设置临时环境变量:命令行中输入set path="d:\jdk\bin";
2>设置永久环境变量:我的电脑/属性/高级/环境变量/系统变量或用户变量/path最前面增加bin目录(D:\java\jdk\bin;),各环境变量之间用;隔开。
3>设置classpath变量:set classpath=.;D:\java\src;(点表示当前所在的路径)
3、压缩class文件:
jar cvf lesson1.jar Hello.class Welcome.class,表示将Hello.class文件和Welcome.class文件压缩到lesson1.jar包中。
jar cvf lesson1.jar lesson1/,表示将lesson1目录下的所有文件打包成lesson1.jar。
4、java源文件名称必须和文件中定义的public类名相同,一个java源文件中只能包含0个或1个public类,切public类中必须包含main()方法。
8、八种基本数据类型
1>byte:8位,范围:-128~127,执行算术运算时,java会将数值转换为高精度进行运算。
2>short:16位,范围:-32768-32767
3>int:32位,有符号4字节
4>long:64位,有符号8字节
5>char:16位,无符号2字节,范围:0-65535
6>float:32位,声明一个float类型数值时须在后面加f,如1.5f
7>double:64位,java默认小数常量为double类型
8>boolean:只能赋值为true,false,不能赋值为0、1等整数,同理判断条件也不能为0或1。
9、数组
1一维数组定义时不能分配空间,如不能声明变量int[2] a;
动态创建一维数组:int[] num = new int[3];
静态创建一维数组:int[] num = new int[]{1,2,3}或者int[] num = {1,2,3};静态创建数组时,不允许指定数组大小,例如不能写成int[] num = new int[3]{1,2,3}。
2>二维数组:
动态创建二维数组:int[][] num = new int[3][4];
静态创建二维数组:int[][] num = new int[][]{{1,2,3},{4,5,6}};
可以声明一个二维数组,每行的长度不一样,例:
int[][] num = new in[3][];
num[0] = new int[3];
num[1] = new int[5];
num[2] = new int[6];
为数组赋值或使用数组时,须注意数组长度及下标,以免发生下标越界。
10、循环语句
if()
{
}
while()
{
}
do
{
}while()
for(int i=0; i<10; i++)(java中i的作用域为大括号之间,而C/C++中i的作用域为此外层循环的结尾)
{
}
小知识:
1、查看文件全名:
工具/文件夹选项/查看/取消选中“隐藏已知文件类型的扩展名”,或者直接拖到运行窗口打开行中。
2、UltraEdit中没有高亮显示关键字,说明文件名后缀有误。
3、某一命令行窗口中,执行start命令,打开一个新的命令行窗口,将拥有和原窗口同样地设置。关闭之后,所有的临时设置将关闭。如果设置了全局环境变量之后,需要重新打开一个新命令行窗口才能生效。