工业机器人运动仿真编程实践:基于Android和OpenGL
上QQ阅读APP看书,第一时间看更新

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部分的示例代码:

978-7-111-59258-7-Chapter03-9.jpg

978-7-111-59258-7-Chapter03-10.jpg

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,其语法格式如下:

978-7-111-59258-7-Chapter03-11.jpg

以下是枚举类型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的常用包及其功能

978-7-111-59258-7-Chapter03-12.jpg

3.3.7 数学运算

java.lang包中提供了一个Math类,Math类包含用于执行数学运算的方法,如初等指数、对数、平方根和三角函数等。表3.6和表3.7分别列举出了Math类中静态常量和常用的方法。

表3.6 Math类的静态常量

978-7-111-59258-7-Chapter03-13.jpg

表3.7 Math类的常用方法

978-7-111-59258-7-Chapter03-14.jpg