
3.3 示例程序设计的Java语法要点
3.3.1 类和对象
1.类的定义
将具有相同属性及相同行为的一组对象称为类,它是Java程序的基本组成单元。类、属性和方法的定义格式和作用如下。
[修饰符]class类名[extends父类名][implements接口1,接口2]{
类属性声明:[修饰符]属性类型 属性名
类方法声明:[修饰符]返回值类型 方法名(形式参数表)[throw异常]{}
}
1)修饰符定义了类、属性和方法的访问特性及其他特性。修饰符包括public、private、protected、static、final、abstract等。
2)继承是由现有的类创建新类的机制。子类(新的类)通过关键字extends继承父类(被继承的类)。Java的类只能有一个直接父类,使用接口可以实现多重继承。一个类可以通过关键字implements实现一个或多个接口。
3)类属性也称为字段或成员变量,它的作用域是整个类。
4)类方法定义了该类的对象所能完成的某一项具体功能。类的构造方法是一种特殊的方法,它的定义方式与普通方法的区别包括以下3点:
①构造方法的名称和类名相同;
②构造方法没有返回值;
③构造方法在创建对象时被自动调用。
以下是创建机器人仿真程序gl_robot中部件part0部分的示例代码:
2.创建对象
Java程序用类创建对象,通过对象之间的信息传递完成各种功能。创建对象就是在内存中开辟一段空间,存放对象的属性和方法。创建对象分为声明对象和实例化对象两个步骤,它们的格式如下:
类名 对象名; //对象的声明
对象名=new 类名(参数列表); //对象的实例化
也可以将两个步骤合为一个步骤,如下:
类名 对象名=new类名(参数列表); //对象的声明和实例化
以下是机器人仿真样机gl_robot中部件part0~part2的声明和实例化的示例代码:
public class viewRenderer implements Renderer{
//加载part0
private_part0 part0=new_part0();
//加载part1
private_part1 part1=new_part1();
//加载part2
private_part2 part2=new_part2();
//
……
}
3.对象的使用
通过访问对象的属性和方法可以使用对象,需要使用引用运算符“.”完成,其格式如下:
对象名.属性名 //使用对象中的属性
对象名.方法名 //使用对象中的方法
以下是机器人仿真程序gl_robot中使用对象_surface的属性和方法的示例代码:
//加载surface类
_surface surface=new_surface();
//调用surface类的rect_vertex()方法
surface.rect_vertex(p0,p1,p2,p3,normal_p0);
//引用surface类的变量
vtx_n=surface.vtx_n;
3.3.2 枚举类型
Java 5以后的版本开始支持枚举类型。当需要一个有限集合,而且有限集合中的数据为特定值时,可以使用枚举类型。枚举类型的定义使用关键字enum,其语法格式如下:
以下是枚举类型OP_MODE的示例代码:
public enumOP_MODE{
AUTOMATIC, //自动模式
JOG, //手动模式
EDIT, //编辑模式
NULL //空闲
}
3.3.3 数组
数组是类型相同的有序数据集合,提供数据的顺序操作和处理机制。
1.数组的声明和初始化
下面以一维数组为例介绍数组的声明和初始化过程。
一维数组的声明和初始化方法为:
数组类型[]数组名;
数组名=new数组类型[元素数目];
或
数组类型[]数组名=new数组类型[元素数目];
以下是一个元素数目为N的整型变量数组a的声明和初始化示例:
int[]a=new int[N];
2.数组的引用
Java语言的数组元素引用方法与C语言相同,下面是一个一维数组的引用示例:
b=a[i];
3.多维数组
使用多维数组可以处理更复杂的数据结构。以下是一个二维数组的声明和初始化示例:
int[][]a=new int[N][M];//N和M是整型变量或常数
3.3.4 String类
1.String类字符串的初始化
使用String类可以定义字符串对象。下面介绍声明和初始化字符串的示例。
声明字符串对象s1:
String s1;
用关键字new创建空白字符串对象s2:
String s2=new String();
用赋值方式声明和初始化一个字符串对象s3:
String s3="OK!";
2.String类字符串与基本数据类型之间的转换
将基本数据类型转化成String类字符串有以下两种方法:
1)Java提供String.valueOf()静态方法,它的功能是返回变量的字符串形式,例如:
intnum=12345;
String str1=String.valueOf(num);//str1的内容是“12345”
2)使用“字符串+操作数”形式时,操作数会被自动转换为字符串类型,例如:
int axisNum=8;
String str2="最大轴数"+axisNum; //str2的内容是“最大轴数8”
基本数据类型都有一个对应的包装类(Wrapper Class),例如,int类型对应Integer类,float类型对应Float类。调用这些包装类的相应方法即可实现String类字符串向基本数据类型的转化,例如:
String s1="10";
int i=Integer.parseInt(s1);
String s2="3.14"
float f=Float.parseFloat(s2);
3.3.5 异常处理
异常是程序运行过程中发生的、会打断程序正常执行的事件,例如被0除溢出、数组越界、文件丢失等都属于异常情况。3.3.4小节最后一段程序中的方法parseInt()和parseFloat()在执行String字符串转化时,如果字符串不合法也会抛出异常。
Java语言提供了try-catch-finally语句,用于实现异常的捕获和处理,其格式如下:
try{
可能抛出异常的语句块
}catch(异常类异常对象){
发生异常时的处理语句
}finally{//finally语句块是可以省略的且一定会运行到的程序代码
}
使用try-catch-finally语句后,String类字符串转化成基本数据类型的完整代码如下:
try{
String s1="10";
int i=Integer.parseInt(s1);
String s2="3.14"
float f=Float.parseFloat(s2);
}catch(NumberFormatException exp){
//发现非法字符,报警
……
}
Java语言还支持在程序中使用关键字throw抛出异常及自定义异常种类,请查阅相关Java语法参考书了解这些语法规则的详细内容。
3.3.6 包的应用
包(Package)又称为类库,是Java语言的重要部分。包是类和接口的容器,用于分隔类名空间,一般将一组功能相近或者相关的类和接口放在一个包中,不同包中的类名可以相同。
创建包是指在当前目录下创建与包名结构一致的目录结构,并将指定的类文件放入该目录。包的声明使用关键字package。package语句必须是Java代码文件的第一条可执行语句,而且一个文件中最多只能有一条package语句。以下是机器人仿真程序gl_robot中包的声明语句,它指明该文件定义的类属于包com.example.gl_robot:packagecom.example.gl_robot; //gl_robot程序包的定义
包的引用分为两种方式。
第一种方式是将包名作为类名的一部分,采用“包名.类名”的格式访问其他包中的类。例如要访问java.util包中的Timer类,则该类可以写成java.util.Timer。
第二种方式是使用import命令将某个包内的类导入,程序代码不用写被引用的包名。例如在代码的开始部分加上“import java.util.*;”,则在程序的其他地方可以直接访问Timer类。以下是import语句的示例代码,其中通配符“*”代表包中的所有类:
import java.net.*; //引用java.net包的全部类
import android.widget.Button; //引用Android系统的Button控件
JDK中包括多种实用的包,如表3.5所列。java.lang包是编译器自动加载的,因此使用该包中的类时,可以省略“import java.lang.*”语句。
表3.5 Java的常用包及其功能
3.3.7 数学运算
java.lang包中提供了一个Math类,Math类包含用于执行数学运算的方法,如初等指数、对数、平方根和三角函数等。表3.6和表3.7分别列举出了Math类中静态常量和常用的方法。
表3.6 Math类的静态常量
表3.7 Math类的常用方法