亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我無法理解對象引用在 Java 中的工作方式?

我無法理解對象引用在 Java 中的工作方式?

慕森王 2023-02-23 16:07:33
我最初理解引用的方式是,它們只是內存引用,保存著它們所持有的實際對象的內存位置。不過,下面的代碼及其輸出讓我感到困惑。在這里您可以看到一個簡單類 Man 的實現。我在第一行創建了一個 Man 對象,引用名為 peter。peter 本身只是一個內存位置,對吧?所以人應該只是將對象存儲在它所在的內存位置。但是當我將另一個 Man 引用分配給 peter 并稍后更改 peter 的名字時,person 不知道這一點并打印名字。這怎么可能,因為它存儲了 peter 的內存引用?它不應該能夠跟隨對其所做的更改嗎?public class Testing {  public static void main(String[] args) {    Man peter = new Man("brown", 182, 78000, "Peter");    Man person = peter;    peter = new Man("brown", 182, 78000, "Leonard");    System.out.println(person.name);  }}class Man {   String hairColor;   int height;   double salary;   String name;   public Man()   {     hairColor = "brown";     height = 180;     salary = 50500.5;     name = "John";   }   public Man(String hair, int high, double pay, String nam)   {        this.height = high;        this.hairColor = hair;        this.salary = pay;        this.name = nam;   }}
查看完整描述

6 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

這里:

Man peter = new Man("brown", 182, 78000, "Peter");

創建一個名為“Peter”的 Man對象

Man person = peter;

創建另一個變量“指向”上面創建的對象。

peter = new Man("brown", 182, 78000, "Leonard");

創建另一個名為 Leonard 的 Man,然后peter變量“指向”那個新的第二個對象。

注意:person沒有“指向”peter. 它指向內存中的 Man “對象”。

另一個 “內存地址”放入變量中peter不會更改您創建的初始對象。


查看完整回答
反對 回復 2023-02-23
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

將引用視為內存地址。我希望這個例子解釋:


Man peter = new Man("brown", 182, 78000, "Peter");

// Create a new Man object which is placed in (for example) memory location 100

// Assign 100 to peter



Man person = peter;

// Assign 100 to person (copying it from peter)


peter = new Man("brown", 182, 78000, "Leonard");

// Create a new Man object which is placed in memory location 120

// 120 is assigned to peter


System.out.println(person.name);

// person still contains 100, so this prints out the details of the first object


查看完整回答
反對 回復 2023-02-23
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

使用 peter=new Man() 創建新的內存位置?,F在已經創建了 2 個內存位置,比如說 100 和 200。仍然有人指向 peter 內存位置 100。因此它顯示第一個構造函數名稱 peter。

如果您想將 nam 值顯示為 Leonardm,請在下面添加行賦值

人 = 彼得;

System.out.println(person.name);


查看完整回答
反對 回復 2023-02-23
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

當你使用

= new Man

您創建一個新對象。所以 peter 在看 Man 1,person 在看新的 Man 2



查看完整回答
反對 回復 2023-02-23
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

您將兩個對象指向相同的內存/位置,然后將另一個引用分配給第一個對象,這樣它就不會影響舊的內存數據。



查看完整回答
反對 回復 2023-02-23
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

Man peter = new Man("brown", 182, 78000, "Peter");

Man person = peter;

peter = new Man("brown", 182, 78000, "Leonard");

第一行將引用分配給名稱為“Peter”的對象,第二行將先前的對象引用分配給變量person。


在第三行中,您創建了一個新對象并將對它的引用分配給變量peter,這是一個全新的引用,而變量person仍然保留前一個對象的引用。


如果你想在兩個變量中都有名字“Leonard”,而不是創建一個新對象,你可以在第三行


person.name = "Leonard";


查看完整回答
反對 回復 2023-02-23
  • 6 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號