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

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

通過私有方法返回更新的變量

通過私有方法返回更新的變量

森欄 2022-06-04 16:38:18
我今天注意到一個場景。當我們在私有方法上傳遞參數時,實體將返回修改后的值,而不是原始值。這是我的示例代碼,/** * @author gowthami * */public class Test {    /**     * @param args     */    public static void main(String[] args) {        String s = "gowth";        System.out.println("before " + s);        concateMe(s, "ami");        System.out.println("after " + s);        BeanTest bt = new BeanTest();        bt.setId("1");        System.out.println("before");        System.out.println(bt.getId());        System.out.println(bt.getName());        setBeanTestName(bt, "gowthami");        System.out.println("after");        System.out.println(bt.getId());        System.out.println(bt.getName());        String st = new String("gowth");        System.out.println("before " + st);        concateMe(st, "ami");        System.out.println("after " + st);    }    private static void setBeanTestName(BeanTest bt, String string) {        bt.setName(string);    }    private static void concateMe(String s, String string) {        s = s+string;        System.out.println("inside method " + s);    }}BeanTest.javapublic class BeanTest {    private String id;    private String name;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}因此,即使我們沒有從私有方法返回它,但字符串不是,bean 也會得到更新。有人可以解釋一下 JVM 級別發生了什么嗎?
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

這是因為 Java 遵循按值調用,而不是按引用調用。


當您傳遞s時,您實際上傳遞的是 s 的值,而不是實際的 s。因此,盡管您在 concateMe() 中更改了s,但它不會在您的 main 方法中更改。


當您傳遞bt時,更改會在您更改該引用的字段變量時產生影響。但是,如果您更改參考,則不會有任何效果。您可以在 main 方法中添加它:


 System.out.println("before......");

 System.out.println(bt.getId());

 System.out.println(bt.getName());

 changeBeanTest(bt);

 System.out.println("after");

 System.out.println(bt.getId());

 System.out.println(bt.getName());

假設你的changeBeanTest是這樣的:


private static void changeBeanTest(BeanTest tempBeanTest) { 

    BeanTest bt = new BeanTest();

    bt.setId("2");

    bt.setName("Trump");

    tempBeanTest = bt;

}

運行這個。從 main() 發送的bt不會有任何變化。


查看完整回答
反對 回復 2022-06-04
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

字符串 s = "gowth"; 在這一行中 s 指向字符串池中的“gowth”。當您在這里調用 private static void concateMe(String s, String string) 時,String s 與調用方方法 String s 不同。這里 String s 范圍是方法 ContactMe 的本地,但是contactMe本地字符串s指向調用者類字符串s所指向的相同“gowth”。在s = s +字符串之后;由于字符串是不可變的,方法本地引用字符串s指向不同的字符串“gowthami”,但調用者方法字符串s是仍然指向“gowth”。所以你得到了這個輸出。但是在 Bean 兩個對象都指向同一個 String 引用的情況下,一旦我們對引用進行了任何更改,它將同時反映在兩個對象中。



查看完整回答
反對 回復 2022-06-04
?
白衣染霜花

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

Bean 是 java 中通過引用傳遞給私有方法的完整對象,因此它在主方法和私有方法中是相同的實例。

您正在修改該實例的值,以便更改顯示在兩個位置。

該字符串或多或少是一個原語,并作為值的副本而不是來自 main 的確切實例傳遞。它是私有方法中的一個新實例,因此您正在修改一個新變量。更改不會顯示在 main 方法中,因為它是不同的實體。


查看完整回答
反對 回復 2022-06-04
  • 3 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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