對象
典型的Java程序會創建許多對象,如你所知,通過調用方法進行交互,通過這些對象交互,程序可以執行各種任務,例如實現GUI,運行動畫或通過網絡發送和接收信息,一旦對象完成了創建它的工作,它的資源就會被回收以供其他對象使用。
這是一個名為CreateObjectDemo的小程序,它創建了三個對象:一個Point對象和兩個Rectangle對象,你將需要所有三個源文件來編譯此程序。
public class CreateObjectDemo { public static void main(String[] args) { // Declare and create a point object and two rectangle objects. Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(originOne, 100, 200); Rectangle rectTwo = new Rectangle(50, 100); // display rectOne"s width, height, and area System.out.println("Width of rectOne: " + rectOne.width); System.out.println("Height of rectOne: " + rectOne.height); System.out.println("Area of rectOne: " + rectOne.getArea()); // set rectTwo"s position rectTwo.origin = originOne; // display rectTwo"s position System.out.println("X Position of rectTwo: " + rectTwo.origin.x); System.out.println("Y Position of rectTwo: " + rectTwo.origin.y); // move rectTwo and display its new position rectTwo.move(40, 72); System.out.println("X Position of rectTwo: " + rectTwo.origin.x); System.out.println("Y Position of rectTwo: " + rectTwo.origin.y); } }
該程序創建、操作和顯示有關各種對象的信息,這是輸出:
Width of rectOne: 100 Height of rectOne: 200 Area of rectOne: 20000 X Position of rectTwo: 23 Y Position of rectTwo: 94 X Position of rectTwo: 40 Y Position of rectTwo: 72
以下三節使用上面的示例來描述程序中對象的生命周期,通過它們,你將學習如何編寫在你自己的程序中創建和使用對象的代碼,你還將了解系統在對象生命結束后如何清理。
創建對象如你所知,一個類提供了對象的藍圖;你從一個類創建一個對象,從CreateObjectDemo程序獲取的以下每個語句都會創建一個對象并將其分配給變量:
Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(originOne, 100, 200); Rectangle rectTwo = new Rectangle(50, 100);
第一行創建Point類的對象,第二行和第三行分別創建Rectangle類的對象。
這些語句中的每一個都有三個部分(下面將詳細討論):
聲明:等號前面的代碼是將變量名稱與對象類型相關聯的所有變量聲明。
實例化:new關鍵字是一個創建對象的Java運算符。
初始化:new運算符后面是對構造函數的調用,該構造函數初始化新對象。
聲明變量以引用對象之前,你了解到要聲明變量,你可以編寫:
type name;
這會通知編譯器你將使用name來引用類型為type的數據,對于原始變量,此聲明還為變量保留適當的內存量。
你還可以在自己的代碼行上聲明引用變量,例如:
Point originOne;
如果你像這樣聲明originOne,它的值將不確定,直到實際創建并分配了一個對象,簡單地聲明引用變量不會創建對象,為此,你需要使用new運算符,如下一節所述,在代碼中使用對象之前,必須將對象分配給originOne,否則,你將收到編譯器錯誤。
此狀態中的變量(當前不引用任何對象)可以如下所示(變量名稱,originOne,以及指向無的引用):
實例化一個類new運算符通過為新對象分配內存并返回對該內存的引用來實例化一個類,new運算符還調用對象構造函數。
注意:短語“實例化類”與“創建對象”的含義相同,創建對象時,你正在創建類的“實例”,因此“實例化”一個類。
new運算符需要一個后綴參數:對構造函數的調用,構造函數的名稱提供要實例化的類的名稱。
new運算符返回對其創建的對象的引用,此引用通常分配給適當類型的變量,如:
Point originOne = new Point(23, 94);
new運算符返回的引用不必分配給變量,它也可以直接用在表達式中,例如:
int height = new Rectangle().height;
這條語句將在下一節中討論。
初始化對象這是Point類的代碼:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; } }
該類包含一個構造函數,你可以識別構造函數,因為它的聲明使用與該類相同的名稱,并且它沒有返回類型,Point類中的構造函數接受兩個整數參數,由代碼(int a, int b)聲明,以下語句提供23和94作為這些參數的值:
Point originOne = new Point(23, 94);
執行此語句的結果可以在下圖中說明:
這是Rectangle類的代碼,它包含四個構造函數:
public class Rectangle { public int width = 0; public int height = 0; public Point origin; // four constructors public Rectangle() { origin = new Point(0, 0); } public Rectangle(Point p) { origin = p; } public Rectangle(int w, int h) { origin = new Point(0, 0); width = w; height = h; } public Rectangle(Point p, int w, int h) { origin = p; width = w; height = h; } // a method for moving the rectangle public void move(int x, int y) { origin.x = x; origin.y = y; } // a method for computing the area of the rectangle public int getArea() { return width * height; } }
每個構造函數都允許你使用基本類型和引用類型為矩形的origin、width和height提供初始值,如果一個類有多個構造函數,則它們必須具有不同的簽名,Java編譯器根據參數的數量和類型區分構造函數。當Java編譯器遇到以下代碼時,它知道在Rectangle類中調用構造函數,該構造函數需要一個Point參數后跟兩個整數參數:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
這就要求Rectangle的一個構造初始化原點originOne,此外,構造函數將width設置為100,將height設置為200,現在有兩個對同一個Point對象的引用 — 一個對象可以有多個對它的引用,如下圖所示:
以下代碼行調用Rectangle構造函數,該構造函數需要兩個整數參數,這些參數提供width和height的初始值,如果檢查構造函數中的代碼,你將看到它創建了一個新的Point對象,其x和y值初始化為0:
Rectangle rectTwo = new Rectangle(50, 100);
以下語句中使用的Rectangle構造函數不帶任何參數,因此它被稱為無參數構造函數:
Rectangle rect = new Rectangle();
所有類至少有一個構造函數,如果類沒有顯式聲明任何,則Java編譯器會自動提供一個無參數構造函數,稱為默認構造函數。此默認構造函數調用父類的無參數構造函數,如果類沒有其他父級,則調用Object構造函數,如果父級沒有構造函數(Object確實有構造函數),編譯器將拒絕該程序。
使用對象一旦你創建了一個對象,你可能想要用它來做某事,你可能需要使用其中一個字段的值,更改其中一個字段,或調用其中一個方法來執行操作。
引用對象的字段對象字段按名稱訪問,你必須使用明確的名稱。
你可以在其自己的類中對于字段使用簡單名稱,例如,我們可以在Rectangle類中添加一個打印width和height的語句:
System.out.println("Width and height are: " + 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("Width of rectOne: " + rectOne.width); System.out.println("Height of 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虛擬機自由回收。
調用對象的方法你還可以使用對象引用來調用對象的方法,將方法的簡單名稱附加到對象引用,并使用插入點運算符(.),此外,你在括號內提供方法的任何參數,如果方法不需要任何參數,請使用空括號。
objectReference.methodName(argumentList);
或者:
objectReference.methodName();
Rectangle類有兩個方法:getArea()用于計算矩形面積,move()用于更改矩形的原點,這是調用這兩個方法的CreateObjectDemo代碼:
System.out.println("Area of rectOne: " + rectOne.getArea()); ... rectTwo.move(40, 72);
第一個語句調用rectOne的getArea()方法并顯示結果,第二行移動rectTwo,因為move()方法為對象的origin.x和origin.y分配新值。
與實例字段一樣,objectReference必須是對象的引用,你可以使用變量名稱,但也可以使用任何返回對象引用的表達式,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運行時環境具有垃圾收集器,可以定期釋放不再引用的對象使用的內存,垃圾收集器在確定時間正確時自動完成其工作。
上一篇:類 下一篇:類的更多方面文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72304.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續版本中引入的改進。 Java教程是希望使用Java編程語言創建應用程序的程序員的實用指南,其中包括數百個完整的工作示例和數十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發軟件并使用...
高級并發對象 到目前為止,本課程重點關注從一開始就是Java平臺一部分的低級別API,這些API適用于非常基礎的任務,但更高級的任務需要更高級別的構建塊,對于充分利用當今多處理器和多核系統的大規模并發應用程序尤其如此。 在本節中,我們將介紹Java平臺5.0版中引入的一些高級并發功能,大多數這些功能都在新的java.util.concurrent包中實現,Java集合框架中還有新的并發數據結構。 ...
摘要:未來的主要發布基于。在中調用函數支持從代碼中直接調用定義在腳本文件中的函數。下面的函數稍后會在端調用為了調用函數,你首先需要將腳本引擎轉換為。調用函數將結果輸出到,所以我們會首先看到輸出。幸運的是,有一套補救措施。 原文:Java 8 Nashorn Tutorial 譯者:飛龍 協議:CC BY-NC-SA 4.0 這個教程中,你會通過簡單易懂的代碼示例,來了解Nashorn Ja...
字符 大多數情況下,如果使用單個字符值,則將使用原始char類型,例如: char ch = a; // Unicode for uppercase Greek omega character char uniChar = u03A9; // an array of chars char[] charArray = { a, b, c, d, e }; 但是,有時候需要使用字符作為對象 — 例如...
閱讀 3665·2021-09-07 09:59
閱讀 724·2019-08-29 15:12
閱讀 808·2019-08-29 11:14
閱讀 1314·2019-08-26 13:27
閱讀 2666·2019-08-26 10:38
閱讀 3138·2019-08-23 18:07
閱讀 1280·2019-08-23 14:40
閱讀 1929·2019-08-23 12:38