JAVA语言基础教程.docx
《JAVA语言基础教程.docx》由会员分享,可在线阅读,更多相关《JAVA语言基础教程.docx(28页珍藏版)》请在冰豆网上搜索。
JAVA语言基础教程
JAVA教程第一讲Java语言概述(4)
1.2.5java平台-不断扩展的计算平台
java不仅是编程语言,还是一个开发平台,java技术给程序员提供了许多工具:
编译器、解释器、文档生成器和文件打包工具等等。
同时java还是一个程序发布平台,有两种主要的"发布环境",首先java运行时环境(javaruntimeenvironment,简称JRE)包含了完整的类文件包,其次许多主要的浏览器都提供了java解释器和运行时环境。
目前Sun公司把java平台划分成J2EE、J2SE、J2ME三个平台,针对不同的市场目标和设备进行定位。
J2EE是Java2EnterpriseEdition,主要目的是为企业计算提供一个应用服务器的运行和开发平台。
J2EE本身是一个开放的标准,任何软件厂商都可以推出自己的符合J2EE标准的产品,使用户可以有多种选择。
IBM、Oracle、BEA、HP等29家已经推出了自己的产品,其中尤以BEA公司的weglogic产品和IBM公司的websphare最为著名。
J2EE将逐步发展成为可以与微软的.NET战略相对抗的网络计算平台。
J2SE是Java2StandardEdition,主要目的是为台式机和工作站提供一个开发和运行的平台。
我们在学习java的过程中,主要是采用J2SE来进行开发。
J2ME是Java2MicroEdition,主要是面向消费电子产品,为消费电子产品提供一个java的运行平台,使得java程序能够在手机、机顶盒、PDA等产品上运行。
上述三个java平台的关系
1.3一切都是对象
1.3.1面向过程
面向对象的第一个原则是把数据和对该数据的操作都封装在一个类中,在程序设计时要考虑多个对象及其相互间的关系。
有些功能并不一定由一个程序段完全实现,可以让其它对象来实现,在本例中就由类Max完成求最大值的功能。
而面向对象的另外一个好处是实现代码的重复使用,例如其它的程序中如果需要求最大值的功能,只需要通过类Max的对象就可以达到目的。
但是如果象面向过程的代码段那样把求最大值的算法都实现在该代码段中,则无法复用
早期的编程语言如FORTRAN、C基本上都是面向过程的语言,其编程的主要思路专注于算法的实现。
例如下面是一个面向过程的求正整数最大值的程序:
intmaxSoFar=0,price=1; //最大值maxSoFar的初始值为0,price是输入的值
while(price>0){ //循环输入price的值
if(price>maxSoFar) //输入的值price大于最大值maxSoFar
maxSoFar=price; //则maxSoFar的值为price的值
Stringinput=JoptionPane.showInputDialog("Enterthenextprice");
//继续输入price
price=Double.parseDouble(input); //把字符串input转换成整数price
}
System.out.println("Themaximumis"+maxSoFar);//打印最大值maxSoFar
}
该程序段主要实现了求最大值的算法,但是,如果考虑用面向对象的编程,可以是另外一种方式:
Maxmax=newMax(); //max是类Max的一个对象
while(price>0){
max.updateMax(price); //对象max调用updateMax方法,更新最大值
price=max.getPrice();//对象max调用getPrice获得下一个price的值
}
System.out.println("Themaximumis"+max.getMax());//对象max调用getMax
方法获得最大值,并打印出来
1.3.2面向对象
纯粹的面向对象程序设计方法是这样的:
1.所有的东西都是对象。
可以将对象想象成为一种新型变量,它保存着数据,而且还可以对自身数据进行操作。
例如类Max中保留着数据的最大值,同时还有方法updateMax根据新加入的price值产生最新的最大值,还有getMax方法返回数据的最大值。
2.程序是一大堆对象的组合。
通过消息传递,各对象知道自己应该做些什么。
如果需要让对象做些事情,则须向该对象"发送一条消息"。
具体来说,可以将消息想象成为一个调用请求,它调用的是从属于目标对象的一个方法。
例如上面面向对象的程序段应该是属于某个类的,比如说是属于类Shopping,则Shopping中就包含了类Max的对象max,调用方法updateMax就相当于Shopping对象对max对象发出一条指令"updateMax",要求对象max重新计算最大值。
3.每个对象都有自己的存储空间。
可容纳其它对象,或者说通过封装现有的对象,可以产生新型对象。
因此,尽管对象的概念非常简单,但是经过封装以后却可以在程序中达到任意高的复杂程度。
4.每个对象都属于某个类。
根据语法,每个对象都是某个"类"的一个"实例"。
一个类的最重要的的特征就是"能将什么消息发给它?
",也就是类本身有哪些操作。
例如max是类Max的实例。
JAVA教程第一讲Java语言概述(5)
1.4构建java程序
1.4.1第一个javaapplication
java程序分为javaapplication(java应用程序)和javaapplet(java小应用程序)两种。
下面让我们编写一个java应用程序,它能够利用来自java标准库的System对象的多种方法,打印出与当前运行的系统有关的资料。
其中"//"代表一种注释方式,表示从这个符号开始到这行结束的所有内容都是注释。
在每个程序文件的开头,如果这个文件的代码中用到了系统所提供的额外的类,就必须放置一个import语句。
说它是额外的是指一个特殊的类库"java.lang"会自动导入到每个java文件
//这是我们的第一个javaapplication,该程序保存在文件Property.java中
importjava.util.*;/*下面我们用到了Date和Properties这两个类,是
属于java.util这个包的;*/
/*而System和Runtime这两个类,是属于
java.lang这个包的。
*/
publicclassProperty{//程序员给这个类取名为Property
publicstaticvoidmain(Stringargs[]){//main是类的主方法
System.out.println(newDate());//在命令行下面打印出日期
Propertiesp=System.getProperties();//获得系统的Properties对象p
p.list(System.out);//在命令行下打印出p中的各个系统变量的值
System.out.println("---MemoryUsage:
");/*打印一行字符串---MemoryUsage*/
Runtimert=Runtime.getRuntime();//获得系统的Runtime对象rt
System.out.println("TotalMemory="
+rt.totalMemory()//打印总内存大小
+"FreeMemory="
+rt.freeMemory());//打印空闲内存大小
}
}
在java中,程序都是以类的方式组织的,java源文件都保存在以java为后缀的.java文件当中。
每个可运行的程序都是一个类文件,或者称之为字节码文件,保存在.class文件中。
而作为一个javaapplication,类中必须包含主方法,程序的执行是从main方法开始的,方法头的格式是确定不变的:
publicstaticvoidmain(Stringargs[])
其中关键字public意味着方法可以由外部世界调用。
main方法的参数是一个字符串数组args,虽然在本程序中没有用到,但是必须列出来。
程序的第一行非常有意思:
System.out.println(newDate());
打印语句的参数是一个日期对象Date,而创建Date对象的目的就是把它的值发给println()语句。
一旦这个语句执行完毕,Date对象就没用了,而后"无用内存回收器"会将其收回。
第二行中调用了System.getProperties()。
从帮助文档中可知,getProperties()是System类的一个静态方法(static方法),由于它是"静态"的,所以不必创建任何对象就可以调用该方法。
在第三行,Properties对象有一个名为list()的方法,它将自己的全部内容都发给一个PrintStream对象,该对象就是list()方法的参数。
第四行和第六行是典型的打印语句,其中第六行通过运算符"+"的重载来连接多个字符串对象,在java中只有当"+"运算符作用于字符串时在能够进行重载。
但是让我们仔细观察下述语句:
System.out.println("TotalMemory="
+rt.totalMemory()//打印总内存大小
+"FreeMemory="
+rt.freeMemory());//打印空闲内存大小
其中,totalMemory()和freeMemory()返回的是数值,并非String对象。
如果将一个字符串与一个数值相加,结果会如何?
在这种情况下,编译器会自动调用一个toString()方法,将该数值(int型或者float型)转换成字符串。
经过这样处理以后,就可以用"+"进行字符串连接了。
main()的第五行通过调用Runtime的getRuntime()方法创建了一个Runtime对象,该对象中包含了内存等信息。
1.4.2java程序的编辑
java程序的编辑可以使用任何一种文本编辑器,例如UltraEdit、Notepad、Wordpad甚至word,然后只要把编辑好的文件存成.java文件。
当然也可以用一些集成开发环境,例如Borland公司的JBuilder,IBM公司的VisualageforJava,此外还有cafe、kawa等其它集成开发环境。
下面两幅图分别是用UltraEdit和JBuilder编辑Property.java文件的情况
Sun公司为全世界的java程序员提供了一个免费的java程序开发包(JavaDevelopKit,简称JDK),其中包括了java编译器命令"javac",以及java执行命令"java",还有帮助文档生成器命令"javadoc"等等。
所有这些命令都可以在命令行下运行,例如我们要编译上述java文件Property.java,如果是在windows中进行开发,就可以在"命令提示符"下进行编译,在命令行中敲入"javacProperty.java".
JAVA教程第一讲Java语言概述(6)
时间:
2010-06-07作者:
许斌编辑:
Mr.阿布点击:
236[评论]
-
-
1.4.4javaapplication的执行
当编译结束以后,在java源文件中的每一个类都会生成相应的.class文件,例如上图中就会生成一个Property.class文件,而java程序在执行时调用的是.class文件。
Javaapplication的执行是在命令行下进行的,如果是在windows系统中,就可以"命令提示符"下敲入"javaPropery"进行执行,该"java"命令会启动java虚拟机,并读入Property.class文件进行执行。
由于该程序的运行结果直接在命令行下进行输出.
1.4.5第一个javaapplet
java程序的另一种形式是javaapplet,applet没有main()方法,它必须嵌在超文本文件中,在浏览器中进行运行。
右面这个程序将在浏览器中显示一行字符串.
//这是我们的第一个javaapplet,该程序保存在文件HelloEducation.java中
importjava.awt.Graphics;//在进行显示输出时,需要用到类Graphics的对象;
importjava.applet.Applet;//Applet类是所有的javaapplet的父类;
publicclassHelloEducationextendsApplet{
//程序员给这个类取名为HelloEducation
//所有的applet程序都是Applet类的子类
publicStrings;
publicvoidinit(){ //
s=newString("WelcometoTongfangEducation");
//生成一个字符串对象
}
publicvoidpaint(Graphicsg){
g.drawString(s,25,25);
//在浏览器中坐标为(25,25)的位置显示字符串s
}
}
applet程序是从方法init()开始执行的,在该方法中完成了对字符串s的初始化工作,而显示功能是在方法paint()中执行的。
paint()方法是类Applet的一个成员方法,其参数是图形对象Graphicsg,通过调用对象g的drawString()方法就可以显示输出。
1.4.6javaapplet的执行
javaapplet程序也是一个类,其编译方式与javaapplication完全一样,HelloEducation.java程序经过编译以后就生成了HelloEducation.class文件。
javaapplet的执行方式与javaapplication完全不同,javaapplet程序必须嵌入到html文件中才能够执行,因此必须编写相应的html文件。
下面为HelloEducaiton.html文件的内容:
然后可以通过JDK所提供的命令"appletviewer",在命令行下面执行javaapplet程序。
如果是在windows操作系统中,就可以在"命令提示符"下敲入"appletviewerHelloEducation.html"。
此时系统会弹出另外一个窗口运行该applet程序。
applet还可以采用另外一种方式运行,那就是直接在浏览器中打开HelloEducation.html程序,结果如图1_4_6所示。
在主流的浏览器如IE、Netscape中都包含有java虚拟机,负责解释执
JAVA教程第一讲Java语言概述(7)
1.5java程序规范
1.5.1java源程序结构
一个完整的java源程序应该包括下列部分:
package语句;//该部分至多只有一句,必须放在源程序的第一句
import语句;/*该部分可以有若干import语句或者没有,必须放在所有的
类定义之前*/
publicclassDefinition;//公共类定义部分,至多只有一个公共类的定义
//java语言规定该java源程序的文件名必须与该公共类名完全一致
classDefinition;//类定义部分,可以有0个或者多个类定义
interfaceDefinition;//接口定义部分,可以有0个或者多个接口定义
例如一个java源程序可以是如下结构,该源程序命名为HelloWorldApp.java:
packagejavawork.helloworld;/*把编译生成的所有.class文件放到包
javawork.helloworld中*/
importjava.awt.*; //告诉编译器本程序中用到系统的AWT包
importjavawork.newcentury;/*告诉编译器本程序中用到用户自定义
的包javawork.newcentury*/
publicclassHelloWorldApp{......}/*公共类HelloWorldApp的定义,
名字与文件名相同*/
classTheFirstClass{......}//第一个普通类TheFirstClass的定义
classTheSecondClass{......}//第二个普通类TheSecondClass的定义
......//其它普通类的定义
interfaceTheFirstInterface{......}/*第一个接口
TheFirstInterface的定义*/
......//其它接口定义
package语句:
由于java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。
为了解决这一问题,java提供包来管理类名空间,包实际提供了一种命名机制和可见性限制机制。
而在java的系统类库中,把功能相似的类放到一个包(package)中,例如所有的图形界面的类都放在java.awt这个包中,与网络功能有关的类都放到这个包中。
用户自己编写的类(指.class文件)也应该按照功能放在由程序员自己命名的相应的包中,例如上例中的javawork.helloworld就是一个包。
包在实际的实现过程中是与文件系统相对应的,例如javawork.helloworld所对应的目录是path\javawork\helloworld,而path是在编译该源程序时指定的。
比如在命令行中编译上述HelloWorldApp.java文件时,可以在命令行中敲入"javac-df:
\javaprojectHelloWorldApp.java",则编译生成的HelloWorldApp.class文件将放在目录f:
\javaproject\javawork\helloworld\目录下面,此时f:
\javaprojcet相当于path。
但是如果在编译时不指定path,则生成的.class文件将放在编译时命令行所在的当前目录下面。
比如在命令行目录f:
\javaproject下敲入编译命令"javacHelloWorldApp.java",则生成的HelloWorldApp.class文件将放在目录f:
\javaproject下面,此时的package语句相当于没起作用。
但是,如果程序中包含了package语句,则在运行时就必须包含包名。
例如,HelloWorldApp.java程序的第一行语句是:
packagep1.p2;编译的时候在命令行下输入"javac-dpathHelloWorldApp.java",则HelloWorldApp.class将放在目录path\p1\p2的下面,这时候运行该程序时有两种方式:
第一种:
在命令行下的path目录下输入字符"javap1.p2.HelloWorldApp"。
第二种:
在环境变量classpath中加入目录path,则运行时在任何目录下输入"javap1.p2.HelloWorldApp"即可。
import语句:
如果在源程序中用到了除java.lang这个包以外的类,无论是系统的类还是自己定义的包中的类,都必须用import语句标识,以通知编译器在编译时找到相应的类文件。
例如上例中的java.awt是系统的包,而javawork.newcentury是用户自定义的包。
比如程序中用到了类Button,而Button是属于包java.awt的,在编译时编译器将从目录classpath\java\awt中去寻找类Button,classpath是事先设定的环境变量,比如可以设为:
classpath=.;d:
\jdk1.3\lib\。
classpath也可以称为类路径,需要提醒大家注意的是,在classpath中往往包含多个路径,用分号隔开。
例如classpath=.;d:
\jdk1.3\lib\中的第一个分号之前的路径是一个点,表示当前目录,分号后面的路径是d:
\jdk1.3\lib\,表示系统的标准类库目录。
在编译过程中寻找类时,先从环境变量classpath的第一个目录开始往下找,比如先从当前目录往下找java.awt中的类Button时,编译器找不着,然后从环境变量classpath的第二个目录开始往下找,就是从系统的标准类库目录d:
\jdk1.3\lib开始往下找java.awt的Button这个类,最后就找到了。
如果要从一个包中引入多个类则在包名后加上".*"表示。
如果程序中用到了用户自己定义的包中的类,假如在上面程序中要用到javawork.newcentury包中的类HelloWorldApp,而包javawork.newcentury所对应的目录是f:
\javaproject\javawork\newcentury,classpath仍旧是classpath=.;d:
\jdk1.3\lib\,则编译器在编译时将首先从当前目录寻找包javawork.newcentury,结果是没有找到;然后又从环境变量classpath的第二个目录d:
\jdk1.3\lib\开始往下找,但是仍然没有找到。
原因在于包javawork.newcentury是放在目录f:
\javaproject下面。
因此,需要重新设定环境变量classpath,设为classpath=.;d:
\jdk1.3\lib\;f:
\javaproject\。
所以编译器从f:
\javaproject开始找包javawork.newcentury就可以找到。
源文件的命名规则:
如果在源程序中包含有公共类的定义,则该源文件名必须与该公共类的名字完全一致,字母的大小写都必须一样。
这是java语言的一个严格的规定,如果不遵守,在编译时就会出错。
因此,在一个java源程序中至多只能有一个公共类的定义。
如果源程序中不包含公共类的定义,则该文件名可以任意取名。
如果在一个源程序中有多个类定义,则在编译时将为每