1、JAVA 教程 第一讲 Java 语言概述(4)1.2.5 java 平台不断扩展的计算平台java 不仅是编程语言,还是一个开发平台,java 技术给程序员提供了许多工具:编译器、解释器、文档生成器和文件打包工具等等。同时 java 还是一个程序发布平台,有两种主要的“发布环境 “,首先 java 运行时环境(java runtime environment,简称 JRE)包含了完整的类文件包,其次许多主要的浏览器都提供了 java 解释器和运行时环境。目前 Sun 公司把 java 平台划分成 J2EE、J2SE、J2ME 三个平台,针对不同的市场目标和设备进行定位。J2EE 是 Java
2、2 Enterprise Edition,主要目的是为企业计算提供一个应用服务器的运行和开发平台。J2EE 本身是一个开放的标准,任何软件厂商都可以推出自己的符合 J2EE 标准的产品,使用户可以有多种选择。IBM、Oracle、BEA、HP 等 29 家已经推出了自己的产品,其中尤以 BEA 公司的 weglogic 产品和 IBM 公司的 websphare 最为著名。J2EE 将逐步发展成为可以与微软的.NET 战略相对抗的网络计算平台。J2SE 是 Java2 Standard Edition,主要目的是为台式机和工作站提供一个开发和运行的平台。我们在学习 java 的过程中,主要是采
3、用 J2SE 来进行开发。J2ME 是 Java2 Micro Edition,主要是面向消费电子产品,为消费电子产品提供一个 java 的运行平台,使得 java 程序能够在手机、机顶盒、PDA 等产品上运行。上述三个 java 平台的关系 1.3 一切都是对象1.3.1 面向过程面向对象的第一个原则是把数据和对该数据的操作都封装在一个类中,在程序设计时要考虑多个对象及其相互间的关系。有些功能并不一定由一个程序段完全实现,可以让其它对象来实现,在本例中就由类 Max 完成求最大值的功能。而面向对象的另外一个好处是实现代码的重复使用,例如其它的程序中如果需要求最大值的功能,只需要通过类 Max
4、 的对象就可以达到目的。但是如果象面向过程的代码段那样把求最大值的算法都实现在该代码段中,则无法复用早期的编程语言如 FORTRAN、C 基本上都是面向过程的语言,其编程的主要思路专注于算法的实现。例如下面是一个面向过程的求正整数最大值的程序:int maxSoFar=0,price=1; /最大值 maxSoFar 的初始值为 0,price 是输入的值while(price0) /循环输入 price 的值if (pricemaxSoFar) /输入的值 price 大于最大值 maxSoFarmaxSoFar=price; /则 maxSoFar 的值为 price 的值String i
5、nput=JoptionPane.showInputDialog(“Enter the next price“); /继续输入 priceprice=Double.parseDouble(input); /把字符串 input 转换成整数 priceSystem.out.println(“The maximum is “+maxSoFar); /打印最大值 maxSoFar该程序段主要实现了求最大值的算法,但是,如果考虑用面向对象的编程,可以是另外一种方式: Max max=new Max( ); /max 是类 Max 的一个对象while(price0) max.updateMax(pri
6、ce); /对象 max 调用 updateMax 方法,更新最大值price=max.getPrice( ); /对象 max 调用 getPrice 获得下一个 price 的值System.out.println(“The maximum is “+max.getMax( );/对象 max 调用 getMax方法获得最大值,并打印出来1.3.2 面向对象纯粹的面向对象程序设计方法是这样的:1 所有的东西都是对象。可以将对象想象成为一种新型变量,它保存着数据,而且还可以对自身数据进行操作。例如类 Max 中保留着数据的最大值,同时还有方法updateMax 根据新加入的 price 值产
7、生最新的最大值,还有 getMax 方法返回数据的最大值。2 程序是一大堆对象的组合。通过消息传递,各对象知道自己应该做些什么。如果需要让对象做些事情,则须向该对象“发送一条消息“ 。具体来说,可以将消息想象成为一个调用请求,它调用的是从属于目标对象的一个方法。例如上面面向对象的程序段应该是属于某个类的,比如说是属于类 Shopping,则 Shopping 中就包含了类 Max 的对象 max,调用方法 updateMax 就相当于 Shopping 对象对 max 对象发出一条指令“updateMax“,要求对象 max 重新计算最大值。3 每个对象都有自己的存储空间。可容纳其它对象,或者
8、说通过封装现有的对象,可以产生新型对象。因此,尽管对象的概念非常简单,但是经过封装以后却可以在程序中达到任意高的复杂程度。4 每个对象都属于某个类。根据语法,每个对象都是某个“ 类“的一个“实例“ 。一个类的最重要的的特征就是“能将什么消息发给它? “,也就是类本身有哪些操作。例如 max是类 Max 的实例。JAVA 教程 第一讲 Java 语言概述(5)1.4 构建 java 程序1.4.1 第一个 java applicationjava 程序分为 java application(java 应用程序)和 java applet(java 小应用程序)两种。下面让我们编写一个 java
9、应用程序,它能够利用来自 java 标准库的 System 对象的多种方法,打印出与当前运行的系统有关的资料。其中“/“代表一种注释方式,表示从这个符号开始到这行结束的所有内容都是注释。在每个程序文件的开头,如果这个文件的代码中用到了系统所提供的额外的类,就必须放置一个 import 语句。说它是额外的是指一个特殊的类库“java.lang“会自动导入到每个 java 文件/这是我们的第一个 java application,该程序保存在文件 Property.java 中import java.util.*; /*下面我们用到了 Date 和 Properties 这两个类,是属于 java
10、.util 这个包的;*/* 而 System 和 Runtime 这两个类,是属于java.lang 这个包的。*/public class Property /程序员给这个类取名为 Propertypublic static void main(String args) /main 是类的主方法System.out.println(new Date( ); /在命令行下面打印出日期Properties p=System.getProperties( ); /获得系统的 Properties 对象 pp.list(System.out); /在命令行下打印出 p 中的各个系统变量的值Syst
11、em.out.println(“- Memory Usage:“); /*打印一行字符串-Memory Usage*/Runtime rt=Runtime.getRuntime( ); /获得系统的 Runtime 对象 rtSystem.out.println(“Total Memory= “ + rt.totalMemory( ) /打印总内存大小+“ Free Memory = “+rt.freeMemory( ); /打印空闲内存大小 在 java 中,程序都是以类的方式组织的,java 源文件都保存在以 java 为后缀的.java 文件当中。每个可运行的程序都是一个类文件,或者称之
12、为字节码文件,保存在.class 文件中。而作为一个 java application,类中必须包含主方法,程序的执行是从 main 方法开始的,方法头的格式是确定不变的:public static void main(String args) 其中关键字 public 意味着方法可以由外部世界调用。main 方法的参数是一个字符串数组 args,虽然在本程序中没有用到,但是必须列出来。程序的第一行非常有意思:System.out.println(new Date();打印语句的参数是一个日期对象 Date,而创建 Date 对象的目的就是把它的值发给println()语句。一旦这个语句执行完
13、毕,Date 对象就没用了,而后“ 无用内存回收器“会将其收回。第二行中调用了 System.getProperties( )。从帮助文档中可知,getProperties( )是 System类的一个静态方法(static 方法) ,由于它是“ 静态“的,所以不必创建任何对象就可以调用该方法。在第三行,Properties 对象有一个名为 list( )的方法,它将自己的全部内容都发给一个 PrintStream 对象,该对象就是 list()方法的参数。第四行和第六行是典型的打印语句,其中第六行通过运算符“ 的重载来连接多个字符串对象,在 java 中只有当“运算符作用于字符串时在能够进行
14、重载。但是让我们仔细观察下述语句:System.out.println(“Total Memory= “ + rt.totalMemory( ) /打印总内存大小+“ Free Memory = “+rt.freeMemory( ); /打印空闲内存大小其中,totalMemory( )和 freeMemory( )返回的是数值,并非 String 对象。如果将一个字符串与一个数值相加,结果会如何?在这种情况下,编译器会自动调用一个 toString()方法,将该数值(int 型或者 float 型)转换成字符串。经过这样处理以后,就可以用“ “进行字符串连接了。main()的第五行通过调用
15、Runtime 的 getRuntime()方法创建了一个 Runtime 对象,该对象中包含了内存等信息。1.4.2 java 程序的编辑java 程序的编辑可以使用任何一种文本编辑器,例如 UltraEdit、Notepad 、Wordpad 甚至 word,然后只要把编辑好的文件存成.java 文件。当然也可以用一些集成开发环境,例如Borland 公司的 JBuilder,IBM 公司的 Visualage for Java,此外还有 cafe、kawa 等其它集成开发环境。下面两幅图分别是用 UltraEdit 和 JBuilder 编辑 Property.java 文件的情况Sun
16、 公司为全世界的 java 程序员提供了一个免费的 java 程序开发包(Java Develop Kit,简称 JDK) ,其中包括了 java 编译器命令“javac“ ,以及 java 执行命令“java“,还有帮助文档生成器命令“javadoc“等等。所有这些命令都可以在命令行下运行,例如我们要编译上述 java 文件 Property.java,如果是在 windows 中进行开发,就可以在“命令提示符“下进行编译,在命令行中敲入“javac Property.java“.JAVA 教程 第一讲 Java 语言概述(6) 时间 : 2010-06-07 作者:许斌 编辑:Mr. 阿布
17、 点击: 236 评论 -1.4.4 java application 的执行当编译结束以后,在 java 源文件中的每一个类都会生成相应的 .class 文件,例如上图中就会生成一个 Property.class 文件,而 java 程序在执行时调用的是 .class 文件。Java application 的执行是在命令行下进行的,如果是在 windows 系统中,就可以“命令提示符“下敲入“java Propery“进行执行,该“java“命令会启动 java 虚拟机,并读入 Property.class 文件进行执行。由于该程序的运行结果直接在命令行下进行输出.1.4.5 第一个 ja
18、va appletjava 程序的另一种形式是 java applet,applet 没有 main()方法,它必须嵌在超文本文件中,在浏览器中进行运行。右面这个程序将在浏览器中显示一行字符串./这是我们的第一个 java applet,该程序保存在文件 HelloEducation.java 中import java.awt.Graphics; / 在进行显示输出时,需要用到类 Graphics 的对象;import java.applet.Applet; /Applet 类是所有的 java applet 的父类;public class HelloEducation extends Ap
19、plet /程序员给这个类取名为 HelloEducation/所有的 applet 程序都是 Applet 类的子类public String s;public void init() /s=new String(“Welcome to Tongfang Education“); /生成一个字符串对象public void paint(Graphics g)g.drawString(s,25,25); /在浏览器中坐标为(25, 25)的位置显示字符串 s applet 程序是从方法 init( )开始执行的,在该方法中完成了对字符串 s 的初始化工作,而显示功能是在方法 paint( )中
20、执行的。paint( )方法是类 Applet 的一个成员方法,其参数是图形对象 Graphics g,通过调用对象 g 的 drawString( )方法就可以显示输出。1.4.6 java applet 的执行java applet 程序也是一个类,其编译方式与 java application 完全一样,HelloEducation.java 程序经过编译以后就生成了 HelloEducation.class 文件。java applet 的执行方式与 java application 完全不同,java applet 程序必须嵌入到 html 文件中才能够执行,因此必须编写相应的 ht
21、ml 文件。下面为 HelloEducaiton.html 文件的内容:然后可以通过 JDK 所提供的命令“appletviewer“,在命令行下面执行 java applet 程序。如果是在 windows 操作系统中,就可以在“命令提示符“下敲入“appletviewer HelloEducation.html“。此时系统会弹出另外一个窗口运行该 applet 程序。applet 还可以采用另外一种方式运行,那就是直接在浏览器中打开 HelloEducation.html程序,结果如图 1_4_6 所示。在主流的浏览器如 IE、Netscape 中都包含有 java 虚拟机,负责解释执JA
22、VA 教程 第一讲 Java 语言概述(7)1.5 java 程序规范1.5.1 java 源程序结构一个完整的 java 源程序应该包括下列部分:package 语句; /该部分至多只有一句,必须放在源程序的第一句import 语句; /*该部分可以有若干 import 语句或者没有,必须放在所有的类定义之前*/public classDefinition; /公共类定义部分,至多只有一个公共类的定义/java 语言规定该 java 源程序的文件名必须与该公共类名完全一致classDefinition; /类定义部分,可以有 0 个或者多个类定义interfaceDefinition; /接
23、口定义部分,可以有 0 个或者多个接口定义例如一个 java 源程序可以是如下结构,该源程序命名为 HelloWorldApp.java:package javawork.helloworld; /*把编译生成的所有.class 文件放到包javawork.helloworld 中*/import java.awt.*; /告诉编译器本程序中用到系统的 AWT 包import javawork.newcentury; /*告诉编译器本程序中用到用户自定义的包 javawork.newcentury*/public class HelloWorldApp. /*公共类 HelloWorldApp
24、 的定义,名字与文件名相同*/class TheFirstClass. /第一个普通类 TheFirstClass 的定义class TheSecondClass. /第二个普通类 TheSecondClass 的定义. /其它普通类的定义interface TheFirstInterface. /*第一个接口TheFirstInterface 的定义*/. /其它接口定义package 语句:由于 java 编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,java 提供包来管理类名空间,包实际提供了一种命名机制和可见性限制机制。而在 jav
25、a 的系统类库中,把功能相似的类放到一个包(package)中,例如所有的图形界面的类都放在 java.awt 这个包中,与网络功能有关的类都放到 这个包中。用户自己编写的类(指 .class 文件)也应该按照功能放在由程序员自己命名的相应的包中,例如上例中的 javawork.helloworld 就是一个包。包在实际的实现过程中是与文件系统相对应的,例如 javawork.helloworld 所对应的目录是pathjavaworkhelloworld,而 path 是在编译该源程序时指定的。比如在命令行中编译上述HelloWorldApp.java 文件时,可以在命令行中敲入 “jav
26、ac -d f:javaproject HelloWorldApp.java“,则编译生成的 HelloWorldApp.class 文件将放在目录f:javaprojectjavaworkhelloworld目录下面,此时 f:javaprojcet 相当于 path。但是如果在编译时不指定 path,则生成的.class 文件将放在编译时命令行所在的当前目录下面。比如在命令行目录 f:javaproject 下敲入编译命令 “javac HelloWorldApp.java“,则生成的HelloWorldApp.class 文件将放在目录 f:javaproject 下面,此时的 pack
27、age 语句相当于没起作用。但是,如果程序中包含了 package 语句,则在运行时就必须包含包名。例如,HelloWorldApp.java 程序的第一行语句是: package p1.p2;编译的时候在命令行下输入“javac -d path HelloWorldApp.java“,则 HelloWorldApp.class 将放在目录 pathp1p2 的下面,这时候运行该程序时有两种方式:第一种:在命令行下的 path 目录下输入字符“java p1.p2.HelloWorldApp“ 。第二种:在环境变量 classpath 中加入目录 path,则运行时在任何目录下输入 “java
28、 p1.p2.HelloWorldApp“即可。import 语句:如果在源程序中用到了除 java.lang 这个包以外的类,无论是系统的类还是自己定义的包中的类,都必须用 import 语句标识,以通知编译器在编译时找到相应的类文件。例如上例中的 java.awt 是系统的包,而 javawork.newcentury 是用户自定义的包。比如程序中用到了类 Button,而 Button 是属于包 java.awt 的,在编译时编译器将从目录classpathjavaawt 中去寻找类 Button,classpath 是事先设定的环境变量,比如可以设为:classpath=.;d:jdk
29、1.3lib。 classpath 也可以称为类路径,需要提醒大家注意的是,在classpath 中往往包含多个路径,用分号隔开。例如 classpath=.;d:jdk1.3lib中的第一个分号之前的路径是一个点,表示当前目录,分号后面的路径是 d:jdk1.3lib,表示系统的标准类库目录。在编译过程中寻找类时,先从环境变量 classpath 的第一个目录开始往下找,比如先从当前目录往下找 java.awt 中的类 Button 时,编译器找不着,然后从环境变量 classpath的第二个目录开始往下找,就是从系统的标准类库目录 d:jdk1.3lib 开始往下找 java.awt 的B
30、utton 这个类,最后就找到了。如果要从一个包中引入多个类则在包名后加上“.*“表示。如果程序中用到了用户自己定义的包中的类,假如在上面程序中要用到javawork.newcentury 包中的类 HelloWorldApp,而包 javawork.newcentury 所对应的目录是f:javaprojectjavaworknewcentury,classpath 仍旧是 classpath=.;d:jdk1.3lib ,则编译器在编译时将首先从当前目录寻找包 javawork.newcentury,结果是没有找到;然后又从环境变量 classpath 的第二个目录 d:jdk1.3lib
31、开始往下找,但是仍然没有找到。原因在于包javawork.newcentury 是放在目录 f:javaproject 下面。因此,需要重新设定环境变量classpath,设为 classpath=.; d:jdk1.3lib;f:javaproject 。所以编译器从 f:javaproject 开始找包 javawork.newcentury 就可以找到。源文件的命名规则:如果在源程序中包含有公共类的定义,则该源文件名必须与该公共类的名字完全一致,字母的大小写都必须一样。这是 java 语言的一个严格的规定,如果不遵守,在编译时就会出错。因此,在一个 java 源程序中至多只能有一个公共类
32、的定义。如果源程序中不包含公共类的定义,则该文件名可以任意取名。如果在一个源程序中有多个类定义,则在编译时将为每个类生成一个.class 文件。1.5.2 java 编程规范软件开发是一个集体协作的过程,程序员之间的代码是经常要进行交换阅读的,因此,java 源程序有一些约定成俗的命名规定,主要目的是为了提高 java 程序的可读性。包名:包名是全小写的名词,中间可以由点分隔开,例如:java.awt.event;类名:首字母大写,通常由多个单词合成一个类名,要求每个单词的首字母也要大写,例如 class HelloWorldApp;接口名:命名规则与类名相同,例如 interface Col
33、lection;方法名:往往由多个单词合成,第一个单词通常为动词,首字母小写,中间的每个单词的首字母都要大写,例如:balanceAccount, isButtonPressed;变量名:全小写,一般为名词,例如:length;常量名:基本数据类型的常量名为全大写,如果是由多个单词构成,可以用下划线隔开,例如:int YEAR, int WEEK_OF_MONTH;如果是对象类型的常量,则是大小写混合,由大写字母把单词隔开。JAVA 教程 第一讲 Java 语言概述(8)1.5.3 java 帮助文档java 中所有类库的介绍都保存在 java 帮助文档中,程序员在编程过程中,必须查阅该帮助文
34、档,了解系统提供的类的功能、成员方法、成员变量等等信息以后,才能够更好的编程。同时,java 开发工具包(JDK)提供了“java“、 “javac“、“javadoc“、“appletviewer“等命令,在 java 帮助文档中也对此进行了详细的介绍。 java 帮助文档是以HTML 文件的形式组织,通常是安装在 JDK 目录下的 docs 子目录中的 index.html 文件,所以用浏览器就可以进行查阅。例如 JDK 是安装在 D:jdk1.3 目录下面,则用浏览器打开D:jdk1.3docsindex.html 文件,就可以看到图 1_5_1 所示的帮助文档。如果希望查阅 JDK 的
35、命令,则可以选择“Tool Documentation“。此时浏览器就会把 java、javac、javadoc、appletviewer 等命令列出来。但是大多时时候,我们需要查阅的是类库的文档,因此需要在“D:jdk1.3docsindex.html“文件中选择“Java 2 Platform API Specification“,如图 1_5_4 中红字所示。然后就进入了详细的类库介绍,如图 1_5_5 所示。1.5.4 java 注释单行注释:从“/“开始到本行结束的内容都是注释,例如:/这是一行单行注释/则是另一行单行注释多行注释:在“/*“和“*/“ 之间的所有内容都是注释,例如:
36、/*这是一段注释分布在多行之中 */文档注释:在注释方面 java 提供一种 C/C+所不具有的文档注释方式。其核心思想是当程序员编完程序以后,可以通过 JDK 提供的 javadoc 命令,生成所编程序的 API 文档,而该文档中的内容主要就是从文档注释中提取的。该 API 文档以 HTML 文件的形式出现,与 java 帮助文档的风格与形式完全一致。凡是在“/*“ 和“*/“之间的内容都是文档注释。例如下面的 DocTest.java 文件:/* 这是一个文档注释的例子,主要介绍下面这个类 */public class DocTest/* 变量注释,下面这个变量主要是充当整数计数 */public int i;/* 方法注释,下面这个方法的主要功能是计数 */public void count( ) 通过在命令行下面运行“javadoc -d . DocTest.java“,就生成了介绍类 DocTest 的index.html 文件,用浏览器浏览结果,注意到 DocTest.java 文件中的文档注释的内容都出现在该 index.html 文件中。