本教程适用于JDK 8。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及其后续版本中更新的语言功能摘要。
请参阅JDK发行说明了解有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
创建对象后,您可能想要对其进行一些操作。您可能需要使用其字段的值,更改其中一个字段,或调用其中一个方法来执行某个操作。
对象字段通过它们的名称进行访问。您必须使用一个清晰的名称。
您可以在其自己的类中使用简单名称来引用字段。例如,我们可以在Rectangle
类中添加一个语句,以打印width
和height
:
System.out.println("宽度和高度为:" + width + "," + height);
在这种情况下,width
和height
是简单名称。
位于对象类之外的代码必须使用对象引用或表达式,后跟点(.)运算符,后跟一个简单字段名称,如:
objectReference.fieldName
例如,在CreateObjectDemo类中的代码位于Rectangle类的代码之外。因此,要引用rectOne命名的Rectangle对象中的origin,width和height字段,CreateObjectDemo类必须使用名称rectOne.origin,rectOne.width和rectOne.height。程序使用这两个名称来显示rectOne的width和height:
System.out.println("rectOne的宽度:" + rectOne.width); System.out.println("rectOne的高度:" + rectOne.height);
尝试从CreateObjectDemo类的代码中使用简单名称width和height是没有意义的,这些字段只存在于对象内部,将导致编译错误。
稍后,程序使用类似的代码来显示有关rectTwo的信息。相同类型的对象具有其自己的相同实例字段的副本。因此,每个Rectangle对象都有名为origin,width和height的字段。当您通过对象引用访问实例字段时,您引用特定对象的字段。在CreateObjectDemo程序中,rectOne和rectTwo两个对象具有不同的origin,width和height字段。
要访问字段,您可以使用对对象的命名引用,如前面的示例所示,或者您可以使用返回对象引用的任何表达式。请记住,new运算符返回一个对象的引用。因此,您可以使用从new返回的值来访问新对象的字段:
int height = new Rectangle().height;
这个语句创建一个新的Rectangle对象,并立即获取其高度。实质上,这个语句计算了一个Rectangle的默认高度。请注意,在执行此语句后,程序不再具有对创建的Rectangle的引用,因为程序没有将引用存储在任何地方。该对象是无引用的,其资源可以被Java虚拟机回收利用。
你还可以使用对象引用来调用对象的方法。你需要在对象引用后附加方法的简单名称,并使用点操作符(.)进行连接。同时,你需要在括号中提供方法的参数。如果方法不需要任何参数,则使用空括号。
对象引用.方法名(参数列表);
或者:
对象引用.方法名();
Rectangle类有两个方法:getArea()用于计算矩形的面积,move()用于改变矩形的原点。以下是调用这两个方法的CreateObjectDemo代码:
System.out.println("rectOne的面积:" + rectOne.getArea()); ... rectTwo.move(40, 72);
第一条语句调用rectOne的getArea()
方法并显示结果。第二行移动rectTwo,因为move()方法会给对象的origin.x和origin.y赋予新的值。
和实例字段一样,对象引用必须是一个指向对象的引用。你可以使用一个变量名,也可以使用任何返回对象引用的表达式。new操作符返回一个对象引用,所以你可以使用new返回的值来调用新对象的方法:
new Rectangle(100, 50).getArea()
表达式new Rectangle(100, 50)返回一个指向Rectangle对象的引用。如上所示,你可以使用点符号来调用新Rectangle的getArea()方法来计算新矩形的面积。
一些方法,例如getArea(),会返回一个值。对于返回值的方法,你可以在表达式中使用方法调用。你可以将返回值赋给一个变量,用它做出决策或控制循环。下面的代码将getArea()的返回值赋给变量areaOfRectangle
:
int areaOfRectangle = new Rectangle(100, 50).getArea();
记住,调用特定对象的方法与向该对象发送消息是一样的。在这种情况下,getArea()被调用的对象是构造函数返回的矩形。
有些面向对象的语言要求你跟踪所创建的所有对象,并在不再需要时显式销毁它们。显式管理内存是繁琐且容易出错的。Java平台允许你创建任意数量的对象(当然受系统限制),而且你不需要担心销毁它们。Java运行时环境在确定对象不再被使用时会删除它们。这个过程被称为垃圾收集。
当没有任何引用指向一个对象时,该对象就可以被垃圾回收。当变量超出作用域时,通常会丢弃变量中保存的引用。或者,你可以通过将变量设置为特殊值null来显式地丢弃对象引用。请记住,一个程序可以对同一个对象有多个引用;在对象可以被垃圾回收之前,所有对该对象的引用都必须被丢弃。
Java运行环境具有垃圾收集器,它会定期释放不再被引用的对象所占用的内存。当垃圾收集器确定时机合适时,它会自动执行清理工作。