6.3 对 象
把类实例化,我们可以生成多个对象,这些对象通过消息传递来进行交互 (消息传递即激活指定的某个对象的方法以改变其状态或让它产生一定的行为),最终完成复杂的任务。一个对象的生命期包括三个阶段:生成、使用和清除。下面我们分别讲述:
6.3.1 对象的生成
对象的生成包括声明、实例化和初始化三方面的内容。通常的格式为:
type objectName = new type ( [paramlist] );
1. type objectName; 声明了一个类型为type的对象。其中type是组合类型(包括类和接口)。 对象的声明并不为对象分配内存空间 。
2. 运算符new为对象分配内存空间,实例化一个对象。new调用对象的构造方法,返回对该对象的一个引用(即该对象所在的内存地址)。用new可以为一个类实例化多个不同的对象。这些对象分别占用不同的内存空间,因此改变其中一个对象的状态不会影响其它对象 的状态。
3. 生成对象的最 后一步是执行构造方法进行初始化。 由于对构造方法可以进行重写,所以通过给出不同个数或类型的参数会分别调用不同的构造方法 。
以 例 6.5中 所 定 义 的 类 Point 为 例 ,我 们 生 成 类 Point的 对 象 :
Point p1 = new Point();
Point p2 = new Point(5,10);
这里,我们为类Point生成了两个对象p1、p2,它们分别调用不同的构造方法,p1调用缺省的构造方法(即没有参数),p2则调用带参数的构造方法。p1、p2分别对应于不同的内存空间,它们的值是不同的,可以完全独立地分别对它们进行操作。
虽然new运算符返回对一个对象的引用,但与C、C++中的指针不同,对象的引用是指向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址,而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。
6.3.2 对象的使用
对象的使用包括引用对象的成员变量和方法,通过运算符 • 可以实现对变量的访问和方法的调用,变量和方法可以通过设定一定的访问权限来允许或禁止其它对象对的访问 。 我 们 先 定 义 一 个 类 Point,它 在 例 6.5的 定 义 中 添 加 了 一 些 内 容 。
例6.6
class Point{
int x,y;
String name = "a point";
Point()
{
x = 0;
y = 0;
}
Point( int x, int y, String name )
{
this.x = x;
this.y = y;
this.name = name;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
void move( int newX, int newY )
{
x = newX;
y = newY;
}
Point newPoint( String name )
{
Point newP = new Point( -x, -y, name );
return newP;
}
boolean equal( int x, int y )
{
if( this.x==x && this.y==y )
return true;
else
return false;
}
void print()
{
System.out.println(name+" : x = "+x+" y = "+y);
}
public static void main( String args[] ){
Point p = new Point();
p.print();
p.move(50,50);
System.out.println("** after moving **");
System.out.println("Get x and y directly");
System.out.println("x = "+p.x+" y = "+p.y);
System.out.println("or Get x and y by calling method");
System.out.println ("x = "+p.getY()+" y = "+p.getY());
if( p.equal(50,50) )
System.out.println("I like this point!!!! ");
else
System.out.println("I hate it!!!!! ");
p.newPoint( "a new point" ).print();
new Point( 10, 15, "another new point" ).print();
}
}
运行结果为:
C:/java UsingObject
a point : x = 0 y = 0
**** after moving *****
Get x and y directly
x = 50 y = 50
or Get x and y by calling method
x = 50 y = 50
I like this point!!!!
a new point : x = -50 y = -50
another new point : x = 10 y = 15
1. 引用对象的变量
要访问对象的某个变量,其格式为:
objectReference.variable
其中objectReference是对象的一个引用,它可以是一个已生成的对象,也可以是能够生成对 象引用的表达式 。
例如 :我们用Point p=new Point();生成了类Point的对象p后,可以用p.x,p.y来访问该点的 x、 y坐标,如
p.x = 10; p.y = 20;
或者用new生成对象的引用,然后直接访问,如 :
tx = new point().x;
2. 调用对象的方法
要调用对象的某个方法,其格式为 :
objectReference.methodName ( [paramlist] );
例 如 我 们 要 移 动 类 Point的 对 象 p,可 以 用
p.move(30,20);虽然我们可以直接访问对象的变量 p.x、p.y来改变点 p的坐标,但 是 通 过 方 法 调 用 的 方 式来实现能更好地体现面向对象的特点,建议在可能的情况下尽可能使用方法调用。同样,也可以用new生成对象的引用,然后直接调用它的方法,如
new point(). move (30,20);
前面已经讲过,在对象的方法执行完后,通常会返回指定类型的值,我们可以合法地使 用这个值,如:例6.6中类Point的方法equal返回布尔值,我们可以用它来作为判断条件分别执行 不同的分支。 如 :
if (p.equal (20,30)){
…… //statements when equal
}else {
…… //statements when unequal
}
另外,类Point的方法newPoint返回该点关于原点的对称点,返回值也是一个Point类型, 我们 可以访问它的变量或调用它的方法,如 :
px = p.newPoint().x 或
px = p.newPoint(). getX();
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。