Java - Classes and Objects - Object
https://docs.oracle.com/javase/tutorial/java/javaOO/objects.html
Classes and Objects
Object
典型的Java程序创建许多对象,如您所知,这些对象通过调用方法进行交互。通过这些对象交互,程序可以执行各种任务,例如实现GUI、运行动画或通过网络发送和接收信息。一旦一个对象完成了创建它的工作,它的资源就会被其他对象回收使用。
Creating Objects
如你所知,类为对象提供了蓝图;从类创建对象。以下来自 CreateObjectDemo 程序的语句都创建了一个对象,并将其赋值给一个变量:
Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Rectangle rectTwo = new Rectangle(50, 100);
Point 是点,Rectangle 是矩形,
new Rectangle(originOne, 100, 200) 表示创建一个起点为originOne,宽为50,高为100的的矩形。
创建对象的语句包括三个部分:
- Declaration(声明部分),如上述的Point originOne,Rectangle rectOne。
- Instantiation(实例化部分),也就是 new 关键字,它是一个创建对象的Java操作符。
- Initialization(初始化部分),new操作符之后是对构造函数的调用,该调用初始化新对象。
下面将会按照这三个部分进行讲解。
Declaring a Variable to Refer to an Object
在前面我们学会了如何声明一个变量:
type name
这将通知编译器,您将使用name来引用类型为type的数据。如果type是基本类型,此声明还为变量保留适当的内存量。
你也可以用 type name 这样的格式声明一个引用变量:
Point originOne;
如果像这样声明originOne,那么它的值在实际创建对象并将其赋值之前是不确定的。简单地声明一个引用变量并不会创建一个对象。为此,需要使用new操作符,如下一节所述。在代码中使用originOne之前,必须将对象赋值给它。否则,您将得到一个编译器错误。
Instantiating a Class
new操作符通过为新对象分配内存并返回对该内存的引用来实例化一个类。new操作符还调用对象构造函数。
Note: The phrase "instantiating a class" means the same thing as "creating an object." When you create an object, you are creating an "instance" of a class, therefore "instantiating" a class.
(实例化一个类和创建一个对象是同一件事,当你创建一个对象时,意味着你正在创建一个类的实例,相当于实例化一个类)
new 操作符后面需要跟一个参数来调用构造函数。这个参数就是构造函数。
new操作符返回对其创建的对象的引用,此引用通常赋值给适当类型的变量,例如:
Point originOne = new Point(23, 94);
new操作符返回的引用不一定要赋值给变量。它也可以直接在表达式中使用。例如:
int height = new Rectangle().height;
Initializing an Object
执行这条语句的结果如下图所示
Point originOne = new Point(23, 94);

每个构造函数都允许您使用基本类型和引用类型为矩形的原点、宽度和高度提供初始值。如果一个类有多个构造函数,它们必须有不同的签名。Java编译器根据参数的数量和类型来区分构造函数。当Java编译器遇到下面的代码时,它知道调用需要一个Point参数和两个整数参数的Rectangle类中的构造函数:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
这调用了Rectangle的一个构造函数,该构造函数将被rectOne引用Rectangle对象的中的origin初始化为originOne。同样,构造函数将宽度设置为100,高度设置为200。现在同一个Point对象有两个引用,一个对象可以有多个引用,如下图所示:

所有类都至少有一个构造函数。如果类没有显式声明任何参数,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。这个默认构造函数调用类父类的无参数构造函数,如果类没有其他父类,则调用Object构造函数。如果父对象没有构造函数(Object有),编译器将拒绝该程序。
Using Objects
调用类中的属性
在类里面调用:
System.out.println("Width and height are: " + width + ", " + height);
在类以外调用:
objectReference.fieldName
例如:
System.out.println("Width of rectOne: " + rectOne.width);
System.out.println("Height of rectOne: " + rectOne.height);
调用类中的方法
类+方法名调用:
objectReference.methodName(argumentList);
or
objectReference.methodName();
例如:
System.out.println("Area of rectOne: " + rectOne.getArea());
rectTwo.move(40, 72);
与实例字段一样,objectReference必须是对对象的引用。您可以使用变量名,但也可以使用返回对象引用的任何表达式。new操作符返回一个对象引用,所以你可以使用new返回的值来调用一个新对象的方法:
使用new操作符调用:
例如:
new Rectangle(100, 50).getArea()
int areaOfRectangle = new Rectangle(100, 50).getArea();
The Garbage Collector
一些面向对象的语言要求您跟踪所有创建的对象,并在不再需要它们时显式地销毁它们。显式地管理内存既繁琐又容易出错。Java平台允许您创建任意数量的对象(当然,受系统处理能力的限制),而且不必担心销毁它们。当Java运行时环境确定不再使用对象时,就删除这些对象。这个过程称为垃圾收集。
当对象不再有对该对象的引用时,该对象就有资格进行垃圾收集。当变量超出作用域时,通常会丢失保存在变量中的引用。或者,可以通过将变量设置为特殊值null显式地删除对象引用。记住,一个程序可以对同一个对象有多个引用;在对象符合垃圾回收条件之前,必须删除对对象的所有引用。
Java运行时环境有一个垃圾收集器,它定期释放不再被引用的对象所使用的内存。垃圾收集器在确定时机合适时自动执行它的工作。

浙公网安备 33010602011771号