这一节概述Java语法的基本规则,并简要介绍一些Java概念,熟悉这些概念对于WebLogic Workshop开发人员十分重要。关于Java语言更详尽的介绍,我已经推荐了一些书籍和介绍性课程,这对您的起步将有所帮助。
基本Java语法
基本类型和包装类
在Java中,所有的变量都有类型,同时必须在使用前先声明。不像某些脚本或过程编程语言可以通过直接使用来引入新的变量,Java需要您请求一个变量,并在使用前指定变量名和类型。尽管这看上去是不必要的工作,但实际上进入开发周期后,很快您就会发现这能帮助您发现程序中的许多错误,因为编译器能强制实行这些限制。您永远不能将字符串错当成整型,并且直到运行应用程序时才显露出错误来。
您可以通过先给定类型,后给定变量名称来声明一个变量。我可以用如下方式声明一个新变量来存放整型数:
int x;
或
String name;
然后可以通过如下方式赋给变量信息:
X = 5;
或
Name = "Carl";
Java提供几种基本类型来处理大多数基本的数据类型。这些基本类型是:
- boolean
- byte
- char
- double
- float
- int
- long
- short
需要存储其他更复杂的数据类型时,您通常需要操纵Java对象。除了以上列出的类型之外,所有的类型都是对象类层次结构的一部分。
Java陷阱:
Java中许多存储和管理对象集合的有用的类(列表、树、数组等)不能在这些基本类型上进行操作,因为从技术上讲这些基本类型不是从Java对象类派生出来的。但是Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型。除了首字母大写之外,包装类与基本类型名字相似:
- Boolean
- Byte
- Char
- Double
- Float
- Integer
- Long
- Short
从基本类型值创建包装类对象很容易,下面显示从int类型创建一个Integer对象:
int myInt; Integer myInteger = new Integer(myInt);
可以用下面的方法从包装对象中取出基本类型值:
myInt = myInteger.intValue();
谨记基本类型和对象之间的区别很重要。Integer和int是极其不同的类型。
同时要注意在Java中,基本类型的内存大小有明确的定义。比如说int永远是32位。这和C或C++语言的情况是不同的,C和C++中基本类型的内存大小没有明确定义,而是取决于编译器的具体实现。
语句
一条语句通常为一个代码逻辑行,如一次赋值或一个函数调用。语句是Java 程序的基本构件。比如一条改变变量值的语句:
X = 5;
或调用一个函数:
calculateIT(x);
也许从上面您已经注意到了,语句必须以分号结尾。开始新代码块(花括号{}包围的代码段)的语句是个例外。
块
如下所示,花括号{}用于包围块:
for( i=0; i< 100; i++) { <一条或多条语句> }
断行的位置不重要。下面的示例与上面的逻辑等价:
for(i=0; i<100; i++) { <一条或多条语句> }
尽管多数程序员会认为后者是不好的编程风格,因为它降低了代码的可读性。但块使您能将一系列语句组织在一起。在上面的示例中,使用块表明块中的所有语句都应作为循环的一部分而依序执行。"
特殊操作符
new操作符:创建对象
在Java中,当您处理非基本类型变量(即对象)时,您不仅需要声明变量并为其命名,还需要为其分配内存空间以存储其数据。在使用对象前确定已为其创建了空间是很重要的。new操作符用于构造类的一个实例。使用方式为,new关键字加类名,紧跟着是小括号括起来的该类的某个构造函数的参数列表。如下面的例子所示:
class MyClass { int firstElement; float secondElement; } MyClass myClassInstance;
// at this point, myClassInstance is null myClassInstance = new MyClass(); //
now myClassInstance refers to an object
此例中,用于创建对象的构造函数不需要参数。然而,一个Java类包含不同参数列表的多个构造函数是很常见的。
.操作符:访问对象成员
.(点)操作符用于访问对象信息或调用对象函数。例如,给定上面所示的类定义和变量声明,可以通过.操作符访问myClassInstance对象的成员,如下所示:
myClassInstance.firstElement = 1; myClassInstance.secondElement = 5.0f;
[]操作符:存取数组
通常使用整型的数组下标存取Java数组。数组下标从0开始。每个数组元素可以使用[]操作符通过下标存取。所以如果您想存储一组名字,您可能会像这样声明一个数组:
String names[5];
并如下设定第一个字符串的值:
name[0] = "Carl";
集合与迭代器
集合
Java定义了一系列集合类。这些类被定义在java.util包中(关于包的更多讨论请见后面)。最常用的集合类是
- ArrayList
- HashMap
- LinkedList
这些类提供对对象集合的方便管理。大体来说,它们只知道Object基类,这样就能够用它们存储用户定义的任意类对象。
举例说来,您可以创建一个LinkedList来管理一组未知大小的对象,如下所示:
LinkedList l = new LinkedList();
l.Add("Bob");
l.Add("Mary");
l.Add("Jane");
...
迭代器
一些集合类通过java.util.Iterator接口提供其内容的遍历。这个接口使您可以遍历一个对象的集合,依次对每个对象进行操作。使用迭代器时要记住,迭代器中包含集合在获取迭代器时的一个快照,通常在遍历迭代器时修改集合本身并不可取。
Javadoc注释
Java定义了一种机制,可为程序元素附加信息并可自动提取该信息。该机制称为Javadoc,原本用来为类、方法和变量附加特殊格式的注释,这样就能为类自动生成文档。标准的Java
API文档就是这样生成的。
Javadoc的注释需要特殊形式的开头:它们必须以/**打头而不是/*。
Java陷阱:由于在第一个Javadoc标记之前的注释可能包含任意文本,因此不允许第一个Javadoc标记之后的任何文本不属于标记值的一部分。这意味着您不能在自由注释文本后面跟上Javadoc标记,然后再跟上更多的自由注释文本。后面的自由注释文本将会被当作最后一个Javadoc标记的参数,并导致编译错误。
除了特殊的注释开头之外,Javadoc定义了几种Javadoc标记为部分代码作标记。Javadoc标记总是以@字符开头。标准的Javadoc标记包括:
- @param:值为一个方法的其中一个参数的描述
- @see:值为对另一个类的引用,在文档中将会形成一个超链接
- @since:值为这个类第一次出现时的版本号
尽管Javadoc标记最初是用来生产文档的,但作为一种方便、系统地为程序元素附加信息(这些信息可能会被自动提取)的方法,现在它也获得了其他方面的用途。
WebLogic Workshop使用Javadoc标记为程序元素关联特殊含义。例如,一个JWS文件中类成员变量上的@jws:control标记,就告诉WebLogic
Workshop将被标记的成员变量当作一个WebLogic Workshop控件来对待。
异常和Try-Catch-Finally块
异常
Java定义了一种通用策略来处理程序的非预期情况。异常是代码中发生非预期行为的信号。一个方法在碰到非预期情况时抛出异常。当您调用抛出异常的方法时,Java编译器会通过将此方法调用置于try-catch块(见下面)中来强迫您处理该异常。
异常是Java类。多数继承自java.lang.Exception类。特定的异常类包含与所遇特定情况相关的信息。可以使用异常类的方法访问异常信息。
Try-Catch-Finally块
可以使用Try-Catch-Finally块处理异常。该模式使您得以在单一位置组织错误处理代码,靠近程序逻辑然而又不必与程序逻辑掺和在一块。下面示范了一个try-catch-finally块,假定doSomething方法抛出BadThingHappenedException异常。
public void callingMethod() { try { doSomething(); } catch (BadThingHappenedException
ex) { <检查异常,报告异常或尝试从异常中恢复> } finally { <清除try块中已完成工作> } return;
}
如果doSomething正常完成,控制会转向try-catch-finally块后的第一条语句。
如果doSomething抛出BadThingHappenedException,该异常将被catch块捕捉。在catch块中,您应该执行任何处理非预期情况所需的动作。
当try块的任意部分得到执行并且有异常抛出,则执行finally块。这时您可以对已执行的部分工作进行清理。例如,try块在异常发生前打开了一个文件,则finally块可以包含关闭该文件的代码。
垃圾收集
Java以前的编译语言,如C和C++,将代码直接编译成与程序运行环境的处理器架构相关的机器码。Java不同,它将代码编译成Java字节码,这是Java虚拟机(JVM)的机器码。这种特性使Java具有天生的可移植性。
因为所有的Java代码都在JVM上运行,JVM可以包括一些传统编程语言难以实现的能力。垃圾收集就是JVM提供的特性之一。
JVM跟踪对每个存在对象的引用。当一个对象的最后一个引用被移除时,对象便不再有用(因为没有人引用它,也就没有人能使用它)。JVM定期性地或在内存资源不足时运行垃圾收集器,销毁所有未引用的对象并回收其内存。
对于程序员来说,这意味着不用跟踪内存分配情况或者记住何时释放对象,JVM将帮您完成这一切。虽然Java包括new关键字,这和C/C++中的malloc函数或C++中的new操作符功能相似,但Java并没有free函数或delete关键字。您完全不必为此担心。Java也可能发生内存泄漏,但远比它之前的语言困难,可能性也更小。
包
声明包
所有的Java代码都存在于所谓的包命名空间。包命名空间用于减少在多个实体被赋予相同名字的情况下可能引起的命名冲突。如果同名的实体位于命名空间的不同部分,它们被认为是不同的并且不会发生冲突。
每个Java源文件的顶部可以包括一个可选的包语句。如果一个文件没有明确地声明一个包,则文件的内容被分配给默认包。
每个类和对象有一个简单名和一个完全限定名。例如,String类有简单名String和完全限定名java.lang.String,因为String类在java.lang包内声明。
包的名字和文件所处的目录层次有一定关系。包含以下声明的文件
package security.application;
必须位于security/application目录,否则Java编译器会出现错误。注意,包允许在包层次结构的不同位置存在同名的类或对象,只要它们的完全限定名惟一即可。这就是为什么标准的Java包能同时在java.util包和java.awt包内各包含一个List类。
如果文件包括一个包语句,则该包语句必须是文件的第一个非注释项。
导入包
在引用其他包中的类和对象前,您必须要导入包或包中所要引用的特定实体。要从前面的示例中导入所有的类和对象,在您的文件中应包含以下语句:
Import security.application.*;
注意下面的语句:
import security.*;
仅导入security包中声明的类和对象,而不导入security.application包或其内容。
假设UserCredentials是security.application包中的类,并且是包中您惟一想引用的类或对象,则可以用下面的语句明确引用:
import security.application.UserCredentials;
如果您只想导入一个大包中的少数类,您应该使用指定的形式明确导入,而不是一次导入整个包。
导入语句必须是文件中可选的包语句后的第一个非注释项。
原文出处:
http://dev2dev.bea.com/products/wlworkshop81/tutorials/java101.jsp

