昨天晚上去听了SCJP的第一次培训课,现在开始也就开始了正式的SCJP的学习,但愿不要和老师上课的进度拉开特别大的距离,因为自已只学了一丁点,要在这12天时间来最大努力的学习Java,尽最大努力取得最好的结果吧!也但愿能在这一学期有这样一个,很多人看来没有用的证书吧!言归正传,开始今天的学习吧,昨在的课件没有拷到,就按照这个盗版书(我是瞎说的,培训班的同学们都认为这个质量不好)的进度来吧,呵呵!
那我就象记流水帐一样的开始吧:)
一、什么是Java技术?
Java技术是:
1.一种编程语言:Java语言的语法与C++相似,而语义与SmallTalk相似,任何传统语言能给创建的应用程序,Java都能够实现;
2.一种开发环境;作为一种开发环境,Java提供了一系列开发工具:编译器,解释器,文档生成器,类文件打包工具,等等;
3.一种应用程序环境;教材上主要也就说了:Java是典型的通用程序不需要依赖浏览器,可以运行于,只要有JRE(Java运行时环境)的任何机器当中,我感觉有点矛盾;
在这一块,书上还提到了,applet程序,是用Java编写,驻留在WEB服务器中,由HTML调用,下载到浏览器当中,由浏览器来运行,为了节约时间,Applet都小,这好象并不能说明,这是一种应用程序环境吧!
这里可能说的应用程序环境也就是说,因为CLASS文件要在Java环境下才能解释才能运行的的原因吧!
4.一种部署环境:什么是部署环境,我不太清楚,“部署”?也说不清楚,他这里说讲了两种部署环境:
· No.1:JRE,由J2SDK(Java 2 Software Development Kit)提供的,包含了一套完整的Java技术包的所有类文件,包括基本语言类和GUI组件类以及高级的集合API 等等。
· No.2:就是浏览器,说了大多数浏览器都提供了Java技术解释器和运行时环境,可是事实上,我觉的现在浏览器对applet的支持,越来越不行了。
二、Java技术的主要目标:
1.提供一种易于编程的语言:
· 取消了其它语言的一些缺陷,如C/C++中的内存管理和指针,这些都会影响代码的健壮性(健壮?不完全清楚)。
· 是面向对象的,有助于用生活中的术语使程序形象化。
· 能够编写简洁的代码,提高执行效率。
2.提供一种解释环境:可以代来两个好处:
· a.缩短编译---->链接-------->安装----------->测试这样一个过程的周期。
· b。代码可移值性,可以使编定的代码能够在大多数操作系统上运行(JVM);
3使用用户能够运行多个活动线程
4允许程序下载代码模块,使得在程序在运行周期内,可以动态改变程序
5.提供更好的安全性,通过检查加载的代码模块来确保安全性
下列特性实现了上述目标:
一、Java虚拟机(JVM)
Java虚拟机规范定义JVM如下:在真实的机器中(硬件)用软件模拟实现的一种虚拟的机器。JVM运行的代码存储在.class文件中,每个文件最多只能含有一个public类的代码。
“JVM规范”提供了编译所有JAVA技术代码的硬件平台规范。这个规范使JAVA软件能够独立于平台,因为编译是针对被称为JVM的“通用机器”而运行的。可用软件模拟在各种不同的计算机系统上运行“通用机器”,也可用硬件来实现这个“虚拟机”。
编译器取得java源代码并生成字节码,字节码是能够被JVM解释的机器指令代码,每个JAVA技术解释器,不论是JAVA技术开发工具,还是能够运行APPLET的WEB浏览器,都有一个JVM的实现,可能也就是说能是基于JVM而运行的吧。
JVM规范为下列概念提供了具体的定义:1.一套指令系统(相当于中央处理器(CPU))。2.一组寄存器。3.类定义规范。4.运行时堆栈(有点含糊)。5.垃圾收集堆。6.一个内存区。
JVM的代码格式由简法,高效的字节码构成。由JVM字节码表示的程序,必须保持正确的类型约定。大部分类型检查在编译时完成。
所有符合Java技术的解释器,必须能够运行:符合JVM规范中所指定的类文件格式的类文件。
二、垃圾收集
许多语言允许在程序运行时动态分配内存,分配内存的过程根据语言的语法不同而不同,但总要涉及一个问题:返回一个指针指向一个内存块的起始位置。如果不再需要已分配的内存(引用该内存块的指针已经溢出),程序或运行环境该释放内存。
在C/C++等语言中,内存的释放由程序员负表,因为不总是知道该何时释放内存,所以有时候,这是一件很痛苦的程序。不释放内存的程序会有可能最终崩溃(当系统中没有剩余内存可供分配时),这些程序被称为具有内存漏洞。
Java语言把程序员解脱出来,而不用再负表内存的释放。它提供了一个系统级的线程来跟踪每个内存的分配,在JVM的空闲周期,垃圾收集线程检查并释放那些可以释放的内存。垃圾收集在Java技术程序的生命周期中自动进行,它消除了释放内存的必要和产生内存漏洞的可能。然而在各种JVM实现中,垃圾收集机制会存在较大的差异。
三、Java运行时环境(JRE)
书上用了一副图来介绍了JRE的运行环境,我这里就用文字,他分了两个大模块。第一个就是编译(编译的意思:Java软件源代码从编写他们的文本格式转换为一套字节码,这些字节码存储在.class文件中):将编写好的.java文件用Javac编译成为.class文件。每二部分是运行时:用javaa命令调用类加载器加载,将。Class文件也就是字节码加载,后用字节码检验器检验合格后,送往解释器(有两个功能:执行字节码和正确调用底层硬件),再送往运行时,最后送到硬件(不知道是显示器之类的,还是送往机器内部运行)。而APPLET程序运行时,先下载那些字节代码,然后由内建于浏览器的JVM来解释该代码。
另外还有一幅图,是说有些java技术的运行时环境,将校验过的字节码直接编译成本地机器代码,并且直接在该硬件平台上运行。这样使得Java软件代码的执行速度接近C/C++,但是会有少量的时间延迟以使该代码被编译成为本地机器代码。
最后注:通过增加新的特性开放技术,SUN Microsystem增强了JVM,这些技术之一被称为Java Hotspot虚拟机,这得JAVA编程语言有和C++编译后的代码运行速度一样快的潜力。
JRE可以运行JVM编译的的代码并执行三个主要任务:
l 由类加载器加载代码,
l 由字节码校验器检验代码。
l 由运行时解释器执行代码。
类加载器:
加载程序执行的全部类,并使用“命名空间”保持本地文件系统的类分离(将本地文件系统的类的命名空间与从网络源导入的类分隔开),以增加安全性,由于总是先加载本地类,可限制任何“特洛伊木马”程序。当全部类被加载后,可执行文件的内存布局也就确定了下来。这时,符号引用被赋值为具体的内存地址,并创建了查询表格。由于内存布局在运行时发生,JAVA技术解释器增加了保护功能,以防止对受限代码区的未授权访问。
字节码校验器
Java软件代码在计算机中运行之前要经过几次测试。JVM将代码输入到一个字节码校验器,测试代码的段格式并检查那些非法代码,如:伪指针,违反对象访问权限、试图改变对象类型的。。等等。
书上还注了一点:所有通过网络导入的类文件都要经过字节码校验器。但不知道这句话是不是意味着,有些不是通过网络导入的类文件,是不是可以不经过字节码校验器???晕。。。。。。。。。。
校验过程:字节码校验器将对程序代码进行四次校验,可以保证代码符合JVM规范并且不违反系统的完整性,若校验器完成四次校验都没有返回错误信息,则可以保证:
代码符合JVM规范,类文件符合JVM规范指定的类文件格式
没有违反系统的完整性,没有访问限制违列
代码没有引起操作数堆栈的上溢或下溢
所有操作代码的参数类型都是正确的
无非法数据转换的发生,如:整型转换成指针型(对象引用)
后边还有第一个程序HelloJava.java程序的学习,这里时间原因就不写了,改天补上吧!