java 中變量的存儲與引用


java交換兩個變量的值

1.幼兒園版

package tst;

public class Test
{
    public static void main(String[] args)
    {
        String x = "xx";
        String y = "yy";
        exchange(x, y);
        System.out.println();
        System.out.println(x+"<->"+y);
    }

    private static void exchange(String a, String b)
    {
        String temp = a;
        a = b;
        b = temp;
        System.err.println(a+"<->"+b);
        System.err.println();

    }
}

顯然,這個是錯的

就從這個版本說起

 

1.java里方法的參數傳遞方式只有一種:值傳遞,就是將實際參數值的副本(復制品)傳入方法內,而參數本身不會受到任何影響.

(是不是覺得自己已經明白為什么上面的程序是錯誤的了)

2.main方法中調用exchange方法時,main方法還未結束,因此main和exchange分配了兩個展區.

所以實際上真正交換的只是exchange棧區中的,而main棧取中的沒有改變

再看一個正確的版本

package tst;

public class Test2
{
    public static void main(String[] args)
    {
        PeopleName pname = new PeopleName();
        pname.firstname = "first";
        pname.lastname = "last";
        swap(pname);
        System.err.println(pname.toString());
    }

    private static void swap(PeopleName p)
    {
        String temp = p.firstname;
        p.firstname = p.lastname;
        p.lastname = temp;
        System.out.println(p);

    }
}

class PeopleName
{
    public String firstname;
    public String lastname;

    @Override
    public String toString()
    {
        return "PeopleName [firstname=" + firstname + ", lastname=" + lastname
                + "]";
    }

}

創建一個對象時,內存中有兩個實體:堆內存中保存了對象本身,棧里面存的是該對象的引用,

沒有調用swap之前是這樣的

 

調用時

 

由於值傳遞,swap的行慘也是一個指向堆的引用,這樣他就可以操作堆,

這樣就明白了吧

拓展

對象的復制

peopleName p1 = new peopleName();

p1.firstname = "qq";

p1.lastname = "ww";

peopleName p2 = p1;

p1.firstname = "ee";

此時P1,P2的firstname屬性都是"ee",原因同上

最后一個很常用的情景,就是從resutlset取對象,這個對象應該在循環外面初始化,還是在循環里面初始ua的問題,答案是在里面(提示用new的初始化會分配內存)

原因同上

1.方法的傳遞機制

 升級版面試題

http://www.2cto.com/kf/201607/528019.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM