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

posted @ 2016-05-25 23:20  牵牛花  阅读(2195)  评论(0编辑  收藏  举报