導航:首頁 > 編程語言 > java對象句柄

java對象句柄

發布時間:2022-03-07 09:56:33

A. java對象保存時,方法是如何保存的

你是說hibernate的對象持久話?
那個是存進資料庫,。

java對象的方法在編譯後,就有固定的內存空間,在類被載入到內存(對象沒有創建時)就已經在內存了。你說咋保存的,當然是在內存了。

B. JAVA中的術語:句柄是啥意思

參考在解釋:

句柄的本質:一個唯一的整數,作為對象的身份id,區分不同的對象,和同類中的不同實例。程序可以通過句柄訪問對象的部分信息。句柄不代表對象的內存地址。
句柄和指針的區別:程序不能通過句柄直接閱讀文件中的信息,指針是可以的。從所起的作用這點來說,句柄就是弱化後的指針,更安全,功能減少。
如果句柄不再I/O文件中,毫無用處。

C. java能獲得窗口句柄嗎

JFrame jf = new JFrame("窗口句柄");
這個 jf 對象就是 你所說的窗口句柄,因為java把指針屏蔽了,所以沒有什麼值地址的東西,如果你 要像C裡面哪裡傳地址的話
java就這樣
JFrame jf1 = new JFrame("窗口句柄");
JFrame jf2 = jf1;
這個jf2 就是 jf1的引用,你改變jf2就改變了jf1
同樣的 函數裡面返回時,只要你不再new一個,
比如
JFrame jf1 = new JFrame("窗口句柄");
public JFrame getJFrameHander(){
return jf1;
}

你在另外的代碼里調用這個函數
比如
{
JFrame jf2 = getJFrameHander();
}
這個jf2就擁有了 jf1的引用,應該就是你所說的句柄
不知道我說的是不是你想知道的那樣

D. Java中對象有什麼用

一切都是對象

「盡管以C++為基礎,但Java是一種更純粹的面向對象程序設計語言」。
無論C++還是Java都屬於雜合語言。但在Java中,設計者覺得這種雜合並不象在C++里那麼重要。雜合語言允許採用多種編程風格;之所以說C++是一種雜合語言,是因為它支持與C語言的向後兼容能力。由於C++是C的一個超集,所以包含的許多特性都是後者不具備的,這些特性使C++在某些地方顯得過於復雜。
Java語言首先便假定了我們只希望進行面向對象的程序設計。也就是說,正式用它設計之前,必須先將自己的思想轉入一個面向對象的世界(除非早已習慣了這個世界的思維方式)。只有做好這個准備工作,與其他OOP語言相比,才能體會到Java的易學易用。在本章,我們將探討Java程序的基本組件,並體會為什麼說Java乃至Java程序內的一切都是對象。

2.1 用句柄操縱對象
每種編程語言都有自己的數據處理方式。有些時候,程序員必須時刻留意准備處理的是什麼類型。您曾利用一些特殊語法直接操作過對象,或處理過一些間接表示的對象嗎(C或C++里的指針)?
所有這些在Java里都得到了簡化,任何東西都可看作對象。因此,我們可採用一種統一的語法,任何地方均可照搬不誤。但要注意,盡管將一切都「看作」對象,但操縱的標識符實際是指向一個對象的「句柄」(Handle)。在其他Java參考書里,還可看到有的人將其稱作一個「引用」,甚至一個「指針」。可將這一情形想像成用遙控板(句柄)操縱電視機(對象)。只要握住這個遙控板,就相當於掌握了與電視機連接的通道。但一旦需要「換頻道」或者「關小聲音」,我們實際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(對象)。如果要在房間里四處走走,並想保持對電視機的控制,那麼手上拿著的是遙控板,而非電視機。
此外,即使沒有電視機,遙控板亦可獨立存在。也就是說,只是由於擁有一個句柄,並不表示必須有一個對象同它連接。所以如果想容納一個詞或句子,可創建一個String句柄:
String s;
但這里創建的只是句柄,並不是對象。若此時向s發送一條消息,就會獲得一個錯誤(運行期)。這是由於s實際並未與任何東西連接(即「沒有電視機」)。因此,一種更安全的做法是:創建一個句柄時,記住無論如何都進行初始化:
String s = "asdf";
然而,這里採用的是一種特殊類型:字串可用加引號的文字初始化。通常,必須為對象使用一種更通用的初始化類型。

2.2 所有對象都必須創建
創建句柄時,我們希望它同一個新對象連接。通常用new關鍵字達到這一目的。new的意思是:「把我變成這些對象的一種新類型」。所以在上面的例子中,可以說:
String s = new String("asdf");
它不僅指出「將我變成一個新字串」,也通過提供一個初始字串,指出了「如何生成這個新字串」。
當然,字串(String)並非唯一的類型。Java配套提供了數量眾多的現成類型。對我們來講,最重要的就是記住能自行創建類型。事實上,這應是Java程序設計的一項基本操作,是繼續本書後余部分學習的基礎。

2.2.1 保存到什麼地方
程序運行時,我們最好對數據保存到什麼地方做到心中有數。特別要注意的是內存的分配。有六個地方都可以保存數據:
(1) 寄存器。這是最快的保存區域,因為它位於和其他所有保存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是根據需要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程序里找到寄存器存在的任何蹤跡。
(2) 堆棧。駐留於常規RAM(隨機訪問存儲器)區域,但可通過它的「堆棧指針」獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些Java數據要保存在堆棧里——特別是對象句柄,但Java對象並不放到其中。
(3) 堆。一種常規用途的內存池(也在RAM區域),其中保存了Java對象。和堆棧不同,「內存堆」或「堆」(Heap)最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會花掉更長的時間!
(4) 靜態存儲。這兒的「靜態」(Static)是指「位於固定位置」(盡管也在RAM里)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但Java對象本身永遠都不會置入靜態存儲空間。
(5) 常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的,因為它們永遠都不會改變。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。
(6) 非RAM存儲。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。其中兩個最主要的例子便是「流式對象」和「固定對象」。對於流式對象,對象會變成位元組流,通常會發給另一台機器。而對於固定對象,對象保存在磁碟中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技巧就是它們能存在於其他媒體中。一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。Java 1.1提供了對Lightweight persistence的支持。未來的版本甚至可能提供更完整的方案。

2.2.2 特殊情況:主要類型
有一系列類需特別對待;可將它們想像成「基本」、「主要」或者「主」(Primitive)類型,進行程序設計時要頻繁用到它們。之所以要特別對待,是由於用new創建對象(特別是小的、簡單的變數)並不是非常有效,因為new將對象置於「堆」里。對於這些類型,Java採納了與C和C++相同的方法。也就是說,不是用new創建變數,而是創建一個並非句柄的「自動」變數。這個變數容納了具體的值,並置於堆棧中,能夠更高效地存取。
Java決定了每種主要類型的大小。就象在大多數語言里那樣,這些大小並不隨著機器結構的變化而變化。這種大小的不可更改正是Java程序具有很強移植能力的原因之一。

主類型

大小

最小值

最大值

封裝器類型

boolean

1-bit





Boolean

char

16-bit

Unicode 0

Unicode 216- 1

Character

byte

8-bit

-128

+127

Byte[11]

short

16-bit

-215

+215 – 1

Short1

int

32-bit

-231

+231 – 1

Integer

long

64-bit

-263

+263 – 1

Long

float

32-bit

IEEE754

IEEE754

Float

double

64-bit

IEEE754

IEEE754

Double

void







Void1

①:到Java 1.1才有,1.0版沒有。

數值類型全都是有符號(正負號)的,所以不必費勁尋找沒有符號的類型。
主數據類型也擁有自己的「封裝器」(wrapper)類。這意味著假如想讓堆內一個非主要對象表示那個主類型,就要使用對應的封裝器。例如:
char c = 'x';
Character C = new Character('c');
也可以直接使用:
Character C = new Character('x');
這樣做的原因將在以後的章節里解釋。

1. 高精度數字
Java 1.1增加了兩個類,用於進行高精度的計算:BigInteger和BigDecimal。盡管它們大致可以劃分為「封裝器」類型,但兩者都沒有對應的「主類型」。
這兩個類都有自己特殊的「方法」,對應於我們針對主類型執行的操作。也就是說,能對int或float做的事情,對BigInteger和BigDecimal一樣可以做。只是必須使用方法調用,不能使用運算符。此外,由於牽涉更多,所以運算速度會慢一些。我們犧牲了速度,但換來了精度。
BigInteger支持任意精度的整數。也就是說,我們可精確表示任意大小的整數值,同時在運算過程中不會丟失任何信息。
BigDecimal支持任意精度的定點數字。例如,可用它進行精確的幣值計算。
至於調用這兩個類時可選用的構建器和方法,請自行參考聯機幫助文檔。

2.2.3 Java的數組
幾乎所有程序設計語言都支持數組。在C和C++里使用數組是非常危險的,因為那些數組只是內存塊。若程序訪問自己內存塊以外的數組,或者在初始化之前使用內存(屬於常規編程錯誤),會產生不可預測的後果(注釋②)。

②:在C++里,應盡量不要使用數組,換用標准模板庫(Standard TemplateLibrary)里更安全的容器。

Java的一項主要設計目標就是安全性。所以在C和C++里困擾程序員的許多問題都未在Java里重復。一個Java可以保證被初始化,而且不可在它的范圍之外訪問。由於系統自動進行范圍檢查,所以必然要付出一些代價:針對每個數組,以及在運行期間對索引的校驗,都會造成少量的內存開銷。但由此換回的是更高的安全性,以及更高的工作效率。為此付出少許代價是值得的。
創建對象數組時,實際創建的是一個句柄數組。而且每個句柄都會自動初始化成一個特殊值,並帶有自己的關鍵字:null(空)。一旦Java看到null,就知道該句柄並未指向一個對象。正式使用前,必須為每個句柄都分配一個對象。若試圖使用依然為null的一個句柄,就會在運行期報告問題。因此,典型的數組錯誤在Java里就得到了避免。
也可以創建主類型數組。同樣地,編譯器能夠擔保對它的初始化,因為會將那個數組的內存劃分成零。
數組問題將在以後的章節里詳細討論。

2.3 絕對不要清除對象
在大多數程序設計語言中,變數的「存在時間」(Lifetime)一直是程序員需要著重考慮的問題。變數應持續多長的時間?如果想清除它,那麼何時進行?在變數存在時間上糾纏不清會造成大量的程序錯誤。在下面的小節里,將闡示Java如何幫助我們完成所有清除工作,從而極大了簡化了這個問題。

2.3.1 作用域
大多數程序設計語言都提供了「作用域」(Scope)的概念。對於在作用域里定義的名字,作用域同時決定了它的「可見性」以及「存在時間」。在C,C++和Java里,作用域是由花括弧的位置決定的。參考下面這個例子:

{
int x = 12;
/* only x available */
{
int q = 96;
/* both x & q available */
}
/* only x available */
/* q 「out of scope」 */
}
作為在作用域里定義的一個變數,它只有在那個作用域結束之前才可使用。
在上面的例子中,縮進排版使Java代碼更易辨讀。由於Java是一種形式自由的語言,所以額外的空格、製表位以及回車都不會對結果程序造成影響。
注意盡管在C和C++里是合法的,但在Java里不能象下面這樣書寫代碼:

{
int x = 12;
{
int x = 96; /* illegal */
}
}
編譯器會認為變數x已被定義。所以C和C++能將一個變數「隱藏」在一個更大的作用域里。但這種做法在Java里是不允許的,因為Java的設計者認為這樣做使程序產生了混淆。

2.3.2 對象的作用域
Java對象不具備與主類型一樣的存在時間。用new關鍵字創建一個Java對象的時候,它會超出作用域的范圍之外。所以假若使用下面這段代碼:

{
String s = new String("a string");
} /* 作用域的終點 */

那麼句柄s會在作用域的終點處消失。然而,s指向的String對象依然占據著內存空間。在上面這段代碼里,我們沒有辦法訪問對象,因為指向它的唯一一個句柄已超出了作用域的邊界。在後面的章節里,大家還會繼續學習如何在程序運行期間傳遞和復制對象句柄。
這樣造成的結果便是:對於用new創建的對象,只要我們願意,它們就會一直保留下去。這個編程問題在C和C++里特別突出。看來在C++里遇到的麻煩最大:由於不能從語言獲得任何幫助,所以在需要對象的時候,根本無法確定它們是否可用。而且更麻煩的是,在C++里,一旦工作完成,必須保證將對象清除。
這樣便帶來了一個有趣的問題。假如Java讓對象依然故我,怎樣才能防止它們大量充斥內存,並最終造成程序的「凝固」呢。在C++里,這個問題最令程序員頭痛。但Java以後,情況卻發生了改觀。Java有一個特別的「垃圾收集器」,它會查找用new創建的所有對象,並辨別其中哪些不再被引用。隨後,它會自動釋放由那些閑置對象占據的內存,以便能由新對象使用。這意味著我們根本不必操心內存的回收問題。只需簡單地創建對象,一旦不再需要它們,它們就會自動離去。這樣做可防止在C++里很常見的一個編程問題:由於程序員忘記釋放內存造成的「內存溢出」。

2.4 新建數據類型:類
如果說一切東西都是對象,那麼用什麼決定一個「類」(Class)的外觀與行為呢?換句話說,是什麼建立起了一個對象的「類型」(Type)呢?大家可能猜想有一個名為「type」的關鍵字。但從歷史看來,大多數面向對象的語言都用關鍵字「class」表達這樣一個意思:「我准備告訴你對象一種新類型的外觀」。class關鍵字太常用了,以至於本書許多地方並沒有用粗體字或雙引號加以強調。在這個關鍵字的後面,應該跟隨新數據類型的名稱。例如:
class ATypeName {/*類主體置於這里}
這樣就引入了一種新類型,接下來便可用new創建這種類型的一個新對象:
ATypeName a = new ATypeName();
在ATypeName里,類主體只由一條注釋構成(星號和斜杠以及其中的內容,本章後面還會詳細講述),所以並不能對它做太多的事情。事實上,除非為其定義了某些方法,否則根本不能指示它做任何事情。

2.4.1 欄位和方法
定義一個類時(我們在Java里的全部工作就是定義類、製作那些類的對象以及將消息發給那些對象),可在自己的類里設置兩種類型的元素:數據成員(有時也叫「欄位」)以及成員函數(通常叫「方法」)。其中,數據成員是一種對象(通過它的句柄與其通信),可以為任何類型。它也可以是主類型(並不是句柄)之一。如果是指向對象的一個句柄,則必須初始化那個句柄,用一種名為「構建器」(第4章會對此詳述)的特殊函數將其與一個實際對象連接起來(就象早先看到的那樣,使用new關鍵字)。但若是一種主類型,則可在類定義位置直接初始化(正如後面會看到的那樣,句柄亦可在定義位置初始化)。
每個對象都為自己的數據成員保有存儲空間;數據成員不會在對象之間共享。下面是定義了一些數據成員的類示例:

class DataOnly {
int i;
float f;
boolean b;
}
這個類並沒有做任何實質性的事情,但我們可創建一個對象:
DataOnly d = new DataOnly();
可將值賦給數據成員,但首先必須知道如何引用一個對象的成員。為達到引用對象成員的目的,首先要寫上對象句柄的名字,再跟隨一個點號(句點),再跟隨對象內部成員的名字。即「對象句柄.成員」。例如:
d.i = 47;
d.f = 1.1f;
d.b = false;
一個對象也可能包含了另一個對象,而另一個對象里則包含了我們想修改的數據。對於這個問題,只需保持「連接句點」即可。例如:
myPlane.leftTank.capacity = 100;
除容納數據之外,DataOnly類再也不能做更多的事情,因為它沒有成員函數(方法)。為正確理解工作原理,首先必須知道「自變數」和「返回值」的概念。我們馬上就會詳加解釋。

1. 主成員的默認值
若某個主數據類型屬於一個類成員,那麼即使不明確(顯式)進行初始化,也可以保證它們獲得一個默認值。

主類型 默認值

Boolean false
Char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

一旦將變數作為類成員使用,就要特別注意由Java分配的默認值。這樣做可保證主類型的成員變數肯定得到了初始化(C++不具備這一功能),可有效遏止多種相關的編程錯誤。
然而,這種保證卻並不適用於「局部」變數——那些變數並非一個類的欄位。所以,假若在一個函數定義中寫入下述代碼:
int x;
那麼x會得到一些隨機值(這與C和C++是一樣的),不會自動初始化成零。我們責任是在正式使用x前分配一個適當的值。如果忘記,就會得到一條編譯期錯誤,告訴我們變數可能尚未初始化。這種處理正是Java優於C++的表現之一。許多C++編譯器會對變數未初始化發出警告,但在Java里卻是錯誤。

2.5 方法、自變數和返回值
迄今為止,我們一直用「函數」(Function)這個詞指代一個已命名的子常式。但在Java里,更常用的一個詞卻是「方法」(Method),代表「完成某事的途徑」。盡管它們表達的實際是同一個意思,但從現在開始,本書將一直使用「方法」,而不是「函數」。
Java的「方法」決定了一個對象能夠接收的消息。通過本節的學習,大家會知道方法的定義有多麼簡單!
方法的基本組成部分包括名字、自變數、返回類型以及主體。下面便是它最基本的形式:

返回類型 方法名( /* 自變數列表*/ ) {/* 方法主體 */}

返回類型是指調用方法之後返回的數值類型。顯然,方法名的作用是對具體的方法進行標識和引用。自變數列表列出了想傳遞給方法的信息類型和名稱。
Java的方法只能作為類的一部分創建。只能針對某個對象調用一個方法(注釋③),而且那個對象必須能夠執行那個方法調用。若試圖為一個對象調用錯誤的方法,就會在編譯期得到一條出錯消息。為一個對象調用方法時,需要先列出對象的名字,在後面跟上一個句點,再跟上方法名以及它的參數列表。亦即「對象名.方法名(自變數1,自變數2,自變數3...)。舉個例子來說,假設我們有一個方法名叫f(),它沒有自變數,返回的是類型為int的一個值。那麼,假設有一個名為a的對象,可為其調用方法f(),則代碼如下:
int x = a.f();
返回值的類型必須兼容x的類型。
象這樣調用一個方法的行動通常叫作「向對象發送一條消息」。在上面的例子中,消息是f(),而對象是a。面向對象的程序設計通常簡單地歸納為「向對象發送消息」。

③:正如馬上就要學到的那樣,「靜態」方法可針對類調用,毋需一個對象。

2.5.1 自變數列表
自變數列表規定了我們傳送給方法的是什麼信息。正如大家或許已猜到的那樣,這些信息——如同Java內其他任何東西——採用的都是對象的形式。因此,我們必須在自變數列表裡指定要傳遞的對象類型,以及每個對象的名字。正如在Java其他地方處理對象時一樣,我們實際傳遞的是「句柄」(注釋④)。然而,句柄的類型必須正確。倘若希望自變數是一個「字串」,那麼傳遞的必須是一個字串。

④:對於前面提及的「特殊」數據類型boolean,char,byte,short,int,long,,float以及double來說是一個例外。但在傳遞對象時,通常都是指傳遞指向對象的句柄。

下面讓我們考慮將一個字串作為自變數使用的方法。下面列出的是定義代碼,必須將它置於一個類定義里,否則無法編譯:

int storage(String s) {
return s.length() * 2;
}

這個方法告訴我們需要多少位元組才能容納一個特定字串里的信息(字串里的每個字元都是16位,或者說2個位元組、長整數,以便提供對Unicode字元的支持)。自變數的類型為String,而且叫作s。一旦將s傳遞給方法,就可將它當作其他對象一樣處理(可向其發送消息)。在這里,我們調用的是length()方法,它是String的方法之一。該方法返回的是一個字串里的字元數。
通過上面的例子,也可以了解return關鍵字的運用。它主要做兩件事情。首先,它意味著「離開方法,我已完工了」。其次,假設方法生成了一個值,則那個值緊接在return語句的後面。在這種情況下,返回值是通過計算表達式「s.length()*2」而產生的。
可按自己的願望返回任意類型,但倘若不想返回任何東西,就可指示方法返回void(空)。下面列出一些例子。

boolean flag() { return true; }
float naturalLogBase() { return 2.718; }
void nothing() { return; }
void nothing2() {}

若返回類型為void,則return關鍵字唯一的作用就是退出方法。所以一旦抵達方法末尾,該關鍵字便不需要了。可在任何地方從一個方法返回。但假設已指定了一種非void的返回類型,那麼無論從何地返回,編譯器都會確保我們返回的是正確的類型。
到此為止,大家或許已得到了這樣的一個印象:一個程序只是一系列對象的集合,它們的方法將其他對象作為自己的自變數使用,而且將消息發給那些對象。這種說法大體正確,但通過以後的學習,大家還會知道如何在一個方法里作出決策,做一些更細致的基層工作。至於這一章,只需理解消息傳送就足le

E. 為什麼說Java中的引用變數以對象的形式存在,引用變數只是保存對象的句柄

Java中的引用變數相當於C語言中的指針,它的作用是指向某個對象.比如

Child t;

t=new Child();

t 是 一個引用變數,指向了一個Child類型的對象.內存中,你首先聲明了一個Child類型的引用變數,然後你創建了一個Child對象,並 把這個對象在堆內存中的地址賦給t,這個地址就是引用變數的值,t是引用變數的名.

由於Java中無法直接使用具體的對象,因此都是通過對象的引用來操作對象的.有的書上,把引用變數也稱為對象句柄.好比你要用勺喝湯,而引用變數或對象句柄就是勺的把手,通過它來實現屬於勺這個對象的喝湯的方法.

最後,引用變數以對象的形式存在,引用變數只是保存對象的句柄?

前半句的意思是引用變數是指向對象的

後半句的意思是引用變數保存了對象在堆內存中的存儲地址,引用變數也被稱為對象句柄

F. Java中的句柄是什麼意思

句柄是系統分配給你操作文件的許可權,你操作所有的文件都需要用到系統分配給你的句柄.比如說
FileInputStream fin=new FileInputStream("c:\123.txt");
fin就是你申請後,系統分配給你c:\123.txt的句柄.你通過FIN來調用這個文件.

G. java引用和句柄的區別和聯系是什麼

關於java中的引用
我覺得在"think
in
java"這本書裡面講得很好
在那本書里
他們把引用叫做"句柄"(Handle)
java中就是用"句柄"來操縱對象的
在java中
任何東西都可以看作是對象
因此,我們可採用一種統一的語法,任何地方均可照搬不誤。但要注意...

H. java 直接在System.out.println()里放入一個對象的句柄,輸出的@15db9742是什麼意思

是你new的對象轉成字元串的值,返回的是getClass().getName() + '@' + Integer.toHexString(hashCode())

I. Java的句柄是什麼意思

關於java中的引用 我覺得在"think in java"這本書裡面講得很好 在那本書里 他們把引用叫做"句柄"(Handle)

java中就是用"句柄"來操縱對象的

在java中 任何東西都可以看作是對象 因此,我們可採用一種統一的語法,任何地方均可照搬不誤。但要注意,盡管將一切都「看作」對象,但操縱的標識符實際是指向一個對象的「句柄」(Handle)。在其他Java參考書里,還可看到有的人將其稱作一個「引用」,甚至一個「指針」。可將這一情形想像成用遙控板(句柄)操縱電視機(對象)。只要握住這個遙控板,就相當於掌握了與電視機連接的通道。但一旦需要「換頻道」或者「關小聲音」,我們實際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(對象)。如果要在房間里四處走走,並想保持對電視機的控制,那麼手上拿著的是遙控板,而非電視機。

此外,即使沒有電視機,遙控板亦可獨立存在。也就是說,只是由於擁有一個句柄,並不表示必須有一個對象同它連接。

J. 請問java中的句柄,對象,實例有什麼區別呢

在java中對象是一個很抽象的概念!對象是以它的實例的形式存在的。
聲明了一個類型的變數也就是聲明了一個該類型的對象。但是這個對象只是一個抽象的概念,並不會在內

存中存在,只有實例化這個對象之後,才會在內存中分配空間。
可以這么理解 :聲明了一個int a 但並沒有初始化它,它就不會具有值。只有a=0這樣初試化a之後,a才

具有0這個值。

實例化對象時就會產生一個指向該對象的這個實例的句柄。

以此為例:
class value{
int i;
}
public class EqualsMethod{
public static void main(string[] args){
value v1=new value();
value v2=new value();
vl.i=v2.i=100;
}
}
在class EqualsMethod 中value v1=new value();
value v2=new value();
這2行首先value v1 value v2
聲明了v1,v2 2個value類型的對象。
然後用new運算符實例化了v1,v2兩個對象。
而v1,v2這兩個標識符,代表的分別是兩個指向對象實例的句柄。

然而當v1.i時我使用的v1這個標識符,並不是對象,我們無法直接操縱對象實例
v1是指向這個對象的句柄,v2也是一樣。我們通過句柄訪問對象實例。

所以在這里v1,v2是句柄,它們所指向的對象我們是看不見的。
求採納,謝謝

閱讀全文

與java對象句柄相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:62
Windows常用c編譯器 瀏覽:778
關於改善國家網路安全的行政命令 瀏覽:833
安卓如何下載網易荒野pc服 瀏覽:654
javainetaddress 瀏覽:104
蘋果4s固件下載完了怎麼解壓 瀏覽:1003
命令zpa 瀏覽:286
python編譯器小程序 瀏覽:945
在app上看視頻怎麼光線調暗 瀏覽:540
可以中文解壓的解壓軟體 瀏覽:593
安卓卸載組件應用怎麼安裝 瀏覽:913
使用面向對象編程的方式 瀏覽:340
程序員項目經理的年終總結範文 瀏覽:930
內衣的加密設計用來幹嘛的 瀏覽:433
淮安數據加密 瀏覽:292
魔高一丈指標源碼 瀏覽:982
松下php研究所 瀏覽:168
c回調java 瀏覽:401
夢幻端游長安地圖互通源碼 瀏覽:746
電腦本地文件如何上傳伺服器 瀏覽:314