對(duì)象
典型的Java程序會(huì)創(chuàng)建許多對(duì)象,如你所知,通過(guò)調(diào)用方法進(jìn)行交互,通過(guò)這些對(duì)象交互,程序可以執(zhí)行各種任務(wù),例如實(shí)現(xiàn)GUI,運(yùn)行動(dòng)畫(huà)或通過(guò)網(wǎng)絡(luò)發(fā)送和接收信息,一旦對(duì)象完成了創(chuàng)建它的工作,它的資源就會(huì)被回收以供其他對(duì)象使用。
這是一個(gè)名為CreateObjectDemo的小程序,它創(chuàng)建了三個(gè)對(duì)象:一個(gè)Point對(duì)象和兩個(gè)Rectangle對(duì)象,你將需要所有三個(gè)源文件來(lái)編譯此程序。
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); } }
該程序創(chuàng)建、操作和顯示有關(guān)各種對(duì)象的信息,這是輸出:
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
以下三節(jié)使用上面的示例來(lái)描述程序中對(duì)象的生命周期,通過(guò)它們,你將學(xué)習(xí)如何編寫(xiě)在你自己的程序中創(chuàng)建和使用對(duì)象的代碼,你還將了解系統(tǒng)在對(duì)象生命結(jié)束后如何清理。
創(chuàng)建對(duì)象如你所知,一個(gè)類提供了對(duì)象的藍(lán)圖;你從一個(gè)類創(chuàng)建一個(gè)對(duì)象,從CreateObjectDemo程序獲取的以下每個(gè)語(yǔ)句都會(huì)創(chuàng)建一個(gè)對(duì)象并將其分配給變量:
Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(originOne, 100, 200); Rectangle rectTwo = new Rectangle(50, 100);
第一行創(chuàng)建Point類的對(duì)象,第二行和第三行分別創(chuàng)建Rectangle類的對(duì)象。
這些語(yǔ)句中的每一個(gè)都有三個(gè)部分(下面將詳細(xì)討論):
聲明:等號(hào)前面的代碼是將變量名稱與對(duì)象類型相關(guān)聯(lián)的所有變量聲明。
實(shí)例化:new關(guān)鍵字是一個(gè)創(chuàng)建對(duì)象的Java運(yùn)算符。
初始化:new運(yùn)算符后面是對(duì)構(gòu)造函數(shù)的調(diào)用,該構(gòu)造函數(shù)初始化新對(duì)象。
聲明變量以引用對(duì)象之前,你了解到要聲明變量,你可以編寫(xiě):
type name;
這會(huì)通知編譯器你將使用name來(lái)引用類型為type的數(shù)據(jù),對(duì)于原始變量,此聲明還為變量保留適當(dāng)?shù)膬?nèi)存量。
你還可以在自己的代碼行上聲明引用變量,例如:
Point originOne;
如果你像這樣聲明originOne,它的值將不確定,直到實(shí)際創(chuàng)建并分配了一個(gè)對(duì)象,簡(jiǎn)單地聲明引用變量不會(huì)創(chuàng)建對(duì)象,為此,你需要使用new運(yùn)算符,如下一節(jié)所述,在代碼中使用對(duì)象之前,必須將對(duì)象分配給originOne,否則,你將收到編譯器錯(cuò)誤。
此狀態(tài)中的變量(當(dāng)前不引用任何對(duì)象)可以如下所示(變量名稱,originOne,以及指向無(wú)的引用):
實(shí)例化一個(gè)類new運(yùn)算符通過(guò)為新對(duì)象分配內(nèi)存并返回對(duì)該內(nèi)存的引用來(lái)實(shí)例化一個(gè)類,new運(yùn)算符還調(diào)用對(duì)象構(gòu)造函數(shù)。
注意:短語(yǔ)“實(shí)例化類”與“創(chuàng)建對(duì)象”的含義相同,創(chuàng)建對(duì)象時(shí),你正在創(chuàng)建類的“實(shí)例”,因此“實(shí)例化”一個(gè)類。
new運(yùn)算符需要一個(gè)后綴參數(shù):對(duì)構(gòu)造函數(shù)的調(diào)用,構(gòu)造函數(shù)的名稱提供要實(shí)例化的類的名稱。
new運(yùn)算符返回對(duì)其創(chuàng)建的對(duì)象的引用,此引用通常分配給適當(dāng)類型的變量,如:
Point originOne = new Point(23, 94);
new運(yùn)算符返回的引用不必分配給變量,它也可以直接用在表達(dá)式中,例如:
int height = new Rectangle().height;
這條語(yǔ)句將在下一節(jié)中討論。
初始化對(duì)象這是Point類的代碼:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; } }
該類包含一個(gè)構(gòu)造函數(shù),你可以識(shí)別構(gòu)造函數(shù),因?yàn)樗穆暶魇褂门c該類相同的名稱,并且它沒(méi)有返回類型,Point類中的構(gòu)造函數(shù)接受兩個(gè)整數(shù)參數(shù),由代碼(int a, int b)聲明,以下語(yǔ)句提供23和94作為這些參數(shù)的值:
Point originOne = new Point(23, 94);
執(zhí)行此語(yǔ)句的結(jié)果可以在下圖中說(shuō)明:
這是Rectangle類的代碼,它包含四個(gè)構(gòu)造函數(shù):
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; } }
每個(gè)構(gòu)造函數(shù)都允許你使用基本類型和引用類型為矩形的origin、width和height提供初始值,如果一個(gè)類有多個(gè)構(gòu)造函數(shù),則它們必須具有不同的簽名,Java編譯器根據(jù)參數(shù)的數(shù)量和類型區(qū)分構(gòu)造函數(shù)。當(dāng)Java編譯器遇到以下代碼時(shí),它知道在Rectangle類中調(diào)用構(gòu)造函數(shù),該構(gòu)造函數(shù)需要一個(gè)Point參數(shù)后跟兩個(gè)整數(shù)參數(shù):
Rectangle rectOne = new Rectangle(originOne, 100, 200);
這就要求Rectangle的一個(gè)構(gòu)造初始化原點(diǎn)originOne,此外,構(gòu)造函數(shù)將width設(shè)置為100,將height設(shè)置為200,現(xiàn)在有兩個(gè)對(duì)同一個(gè)Point對(duì)象的引用 — 一個(gè)對(duì)象可以有多個(gè)對(duì)它的引用,如下圖所示:
以下代碼行調(diào)用Rectangle構(gòu)造函數(shù),該構(gòu)造函數(shù)需要兩個(gè)整數(shù)參數(shù),這些參數(shù)提供width和height的初始值,如果檢查構(gòu)造函數(shù)中的代碼,你將看到它創(chuàng)建了一個(gè)新的Point對(duì)象,其x和y值初始化為0:
Rectangle rectTwo = new Rectangle(50, 100);
以下語(yǔ)句中使用的Rectangle構(gòu)造函數(shù)不帶任何參數(shù),因此它被稱為無(wú)參數(shù)構(gòu)造函數(shù):
Rectangle rect = new Rectangle();
所有類至少有一個(gè)構(gòu)造函數(shù),如果類沒(méi)有顯式聲明任何,則Java編譯器會(huì)自動(dòng)提供一個(gè)無(wú)參數(shù)構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)。此默認(rèn)構(gòu)造函數(shù)調(diào)用父類的無(wú)參數(shù)構(gòu)造函數(shù),如果類沒(méi)有其他父級(jí),則調(diào)用Object構(gòu)造函數(shù),如果父級(jí)沒(méi)有構(gòu)造函數(shù)(Object確實(shí)有構(gòu)造函數(shù)),編譯器將拒絕該程序。
使用對(duì)象一旦你創(chuàng)建了一個(gè)對(duì)象,你可能想要用它來(lái)做某事,你可能需要使用其中一個(gè)字段的值,更改其中一個(gè)字段,或調(diào)用其中一個(gè)方法來(lái)執(zhí)行操作。
引用對(duì)象的字段對(duì)象字段按名稱訪問(wèn),你必須使用明確的名稱。
你可以在其自己的類中對(duì)于字段使用簡(jiǎn)單名稱,例如,我們可以在Rectangle類中添加一個(gè)打印width和height的語(yǔ)句:
System.out.println("Width and height are: " + width + ", " + height);
在這種情況下,width和height是簡(jiǎn)單的名稱。
對(duì)象類外部的代碼必須使用對(duì)象引用或表達(dá)式,后跟點(diǎn)(.)運(yùn)算符,后跟簡(jiǎn)單字段名稱,如下所示:
objectReference.fieldName
例如,CreateObjectDemo類中的代碼位于Rectangle類的代碼之外,因此,要引用名為rectOne的Rectangle對(duì)象中的origin、width和height字段,CreateObjectDemo類必須分別使用名稱rectOne.origin、rectOne.width和rectOne.height,該程序使用其中兩個(gè)名稱來(lái)顯示rectOne的width和height:
System.out.println("Width of rectOne: " + rectOne.width); System.out.println("Height of rectOne: " + rectOne.height);
嘗試在CreateObjectDemo類中的代碼使用簡(jiǎn)單名稱的width和height沒(méi)有意義 — 這些字段僅存在于對(duì)象中 — 并導(dǎo)致編譯器錯(cuò)誤。
稍后,該程序使用類似的代碼來(lái)顯示有關(guān)rectTwo的信息,相同類型的對(duì)象具有自己的相同實(shí)例字段的副本,因此,每個(gè)Rectangle對(duì)象都有名為origin、width和height的字段。通過(guò)對(duì)象引用訪問(wèn)實(shí)例字段時(shí),將引用該特定對(duì)象的字段,CreateObjectDemo程序中的兩個(gè)對(duì)象rectOne和rectTwo具有不同的origin、width和height字段。
要訪問(wèn)字段,你可以使用對(duì)象的命名引用,如前面的示例所示,或者你可以使用任何返回對(duì)象引用的表達(dá)式。回想一下,new運(yùn)算符返回對(duì)象的引用,因此,你可以使用new返回的值來(lái)訪問(wèn)新對(duì)象的字段:
int height = new Rectangle().height;
該語(yǔ)句創(chuàng)建一個(gè)新的Rectangle對(duì)象并立即獲得其高度,實(shí)質(zhì)上,該語(yǔ)句計(jì)算Rectangle的默認(rèn)高度。請(qǐng)注意,在執(zhí)行此語(yǔ)句之后,程序不再具有對(duì)創(chuàng)建的Rectangle的引用,因?yàn)槌绦驈奈丛谌魏蔚胤酱鎯?chǔ)引用,該對(duì)象未被引用,其資源可由Java虛擬機(jī)自由回收。
調(diào)用對(duì)象的方法你還可以使用對(duì)象引用來(lái)調(diào)用對(duì)象的方法,將方法的簡(jiǎn)單名稱附加到對(duì)象引用,并使用插入點(diǎn)運(yùn)算符(.),此外,你在括號(hào)內(nèi)提供方法的任何參數(shù),如果方法不需要任何參數(shù),請(qǐng)使用空括號(hào)。
objectReference.methodName(argumentList);
或者:
objectReference.methodName();
Rectangle類有兩個(gè)方法:getArea()用于計(jì)算矩形面積,move()用于更改矩形的原點(diǎn),這是調(diào)用這兩個(gè)方法的CreateObjectDemo代碼:
System.out.println("Area of rectOne: " + rectOne.getArea()); ... rectTwo.move(40, 72);
第一個(gè)語(yǔ)句調(diào)用rectOne的getArea()方法并顯示結(jié)果,第二行移動(dòng)rectTwo,因?yàn)?b>move()方法為對(duì)象的origin.x和origin.y分配新值。
與實(shí)例字段一樣,objectReference必須是對(duì)象的引用,你可以使用變量名稱,但也可以使用任何返回對(duì)象引用的表達(dá)式,new運(yùn)算符返回一個(gè)對(duì)象引用,因此你可以使用new返回的值來(lái)調(diào)用新對(duì)象的方法:
new Rectangle(100, 50).getArea()
表達(dá)式new Rectangle(100, 50)返回引用Rectangle對(duì)象的對(duì)象引用,如圖所示,你可以使用點(diǎn)表示法來(lái)調(diào)用新的Rectangle的getArea()方法來(lái)計(jì)算新矩形的面積。
某些方法,如getArea()返回一個(gè)值,對(duì)于返回值的方法,可以在表達(dá)式中使用方法調(diào)用,你可以將返回值分配給變量,使用它來(lái)做出決策或控制循環(huán),此代碼將getArea()返回的值賦給變量areaOfRectangle:
int areaOfRectangle = new Rectangle(100, 50).getArea();
請(qǐng)記住,在特定對(duì)象上調(diào)用方法與向該對(duì)象發(fā)送消息相同,在這種情況下,調(diào)用getArea()的對(duì)象是構(gòu)造函數(shù)返回的矩形。
垃圾收集器某些面向?qū)ο蟮恼Z(yǔ)言要求你跟蹤所創(chuàng)建的所有對(duì)象,并在不再需要時(shí)明確銷毀它們,明確地管理內(nèi)存是乏味且容易出錯(cuò)的,Java平臺(tái)允許你根據(jù)需要?jiǎng)?chuàng)建任意數(shù)量的對(duì)象(當(dāng)然,受系統(tǒng)可以處理的限制),你不必關(guān)心銷毀它們。Java運(yùn)行時(shí)環(huán)境在確定不再使用對(duì)象時(shí)刪除對(duì)象,此過(guò)程稱為垃圾回收。
當(dāng)沒(méi)有對(duì)該對(duì)象的引用時(shí),對(duì)象有資格進(jìn)行垃圾回收,當(dāng)變量超出范圍時(shí),通常會(huì)刪除變量中保存的引用,或者,你可以通過(guò)將變量設(shè)置為特殊值null來(lái)顯式刪除對(duì)象引用。請(qǐng)記住,程序可以對(duì)同一對(duì)象具有多個(gè)引用;在對(duì)象符合垃圾回收條件之前,必須刪除對(duì)對(duì)象的所有引用。
Java運(yùn)行時(shí)環(huán)境具有垃圾收集器,可以定期釋放不再引用的對(duì)象使用的內(nèi)存,垃圾收集器在確定時(shí)間正確時(shí)自動(dòng)完成其工作。
上一篇:類 下一篇:類的更多方面文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72304.html
Java? 教程 Java教程是為JDK 8編寫(xiě)的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書(shū)籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買(mǎi)。 入門(mén) 介紹Java技術(shù)和安裝Java開(kāi)發(fā)軟件并使用...
摘要:反射非常強(qiáng)大和有用。另外,反射可以用在映射結(jié)果集的列名到對(duì)象的方法。本教程將深入介紹反射。本教程還將清除一些關(guān)于范型信息在運(yùn)行時(shí)可用性的認(rèn)知混淆。類對(duì)象使用反射時(shí),起點(diǎn)通常是需要使用反射檢視的類的對(duì)象。 Java反射可以在運(yùn)行時(shí)檢視類、接口、屬性和方法,而無(wú)需在編譯時(shí)知道類名、方法名等等。它也同樣使用反射支持實(shí)例化新的對(duì)象、調(diào)用方法和get/set屬性值。 Java反射非常強(qiáng)大和有用...
高級(jí)并發(fā)對(duì)象 到目前為止,本課程重點(diǎn)關(guān)注從一開(kāi)始就是Java平臺(tái)一部分的低級(jí)別API,這些API適用于非?;A(chǔ)的任務(wù),但更高級(jí)的任務(wù)需要更高級(jí)別的構(gòu)建塊,對(duì)于充分利用當(dāng)今多處理器和多核系統(tǒng)的大規(guī)模并發(fā)應(yīng)用程序尤其如此。 在本節(jié)中,我們將介紹Java平臺(tái)5.0版中引入的一些高級(jí)并發(fā)功能,大多數(shù)這些功能都在新的java.util.concurrent包中實(shí)現(xiàn),Java集合框架中還有新的并發(fā)數(shù)據(jù)結(jié)構(gòu)。 ...
摘要:未來(lái)的主要發(fā)布基于。在中調(diào)用函數(shù)支持從代碼中直接調(diào)用定義在腳本文件中的函數(shù)。下面的函數(shù)稍后會(huì)在端調(diào)用為了調(diào)用函數(shù),你首先需要將腳本引擎轉(zhuǎn)換為。調(diào)用函數(shù)將結(jié)果輸出到,所以我們會(huì)首先看到輸出。幸運(yùn)的是,有一套補(bǔ)救措施。 原文:Java 8 Nashorn Tutorial 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 這個(gè)教程中,你會(huì)通過(guò)簡(jiǎn)單易懂的代碼示例,來(lái)了解Nashorn Ja...
字符 大多數(shù)情況下,如果使用單個(gè)字符值,則將使用原始char類型,例如: char ch = a; // Unicode for uppercase Greek omega character char uniChar = u03A9; // an array of chars char[] charArray = { a, b, c, d, e }; 但是,有時(shí)候需要使用字符作為對(duì)象 — 例如...
閱讀 3672·2021-09-07 09:59
閱讀 728·2019-08-29 15:12
閱讀 814·2019-08-29 11:14
閱讀 1321·2019-08-26 13:27
閱讀 2674·2019-08-26 10:38
閱讀 3143·2019-08-23 18:07
閱讀 1284·2019-08-23 14:40
閱讀 1934·2019-08-23 12:38