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.方法的传递机制

时间: 2024-11-08 23:28:42

java 中变量的存储与引用的相关文章

java中变量的存储位置

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.) 3. 堆:存放所有new出来的对象. 4. 静态域:存放静态成员(static定义的) 5. 常量池:存放字符串常量和基本类型常量(public static final). 6. 非RAM存储:硬盘等永久存储空间 这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象

java中变量命名和引用变量的一个坑

这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西.第二个主题,就是讨论一下对象引用变量的一个注意点. 如果你对命名规则很熟啦,就直接看第二个内容吧.(上边的图稍微有点顺序紊乱啊) 一.java中变量的命名规则 大多数语言的命名规则是相似的,只有一些微小的差别. 变量的第一个位置,可以是字母,下划线(_),美元符($) (这个在c/c++,python中是不行的)(注意:不能是数字哦,一想就知道啦为什仫) 其他的位置可以是数字,字母,下划线 不能使用java中的关键字 j

一道笔试题来理顺Java中的值传递和引用传递

前段时间参加了一场面试,其中有一道引用传递的题,因为当时并没有考虑清楚所以做错了. 现在来复盘一下,题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = new StringBuffer("new world"); str12.append("new world");} public static void main(Stri

深刻理解Java中形参与实参,引用与对象的关系

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道,在Java中,除了基本数据类型之外,其他的都是引用类型,当它们作为函数参数时,传递的也是引用,通过引用可以改变对象的值,很多人便因此而忽略形参与实参,引用与对象的关系问题.废话不多说,先看下面一个例子: import java.util.*; public class Student { private String

Java基础---Java中变量使用规则(六)

Java中变量的使用规则 不得不接受的变量小脾气: 1.Java 中的变量需要先声明后使用 2.变量使用时,可以声明变量的同时进行初始化,也可以先声明后赋值 3.变量中每次只能赋一个值,但可以修改多次 4.main 方法中定义的变量必须先赋值,然后才能输出 关于 String :表示变量中存储的数据的类型为字符串,后面小节中会详细讲到,小小期待吧~~ 代码: public class HelloWorld{    public static void main(String[] args) { 

java中的值传递和引用传递有什么区别呀?

值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递: (形式参数类型是引用数据类型参数除去String):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数

java中变量运算细节 (2)

/* 目的:测试变量的运算方式 结果:byte a, b, c; a = b+c; 或者 a = b+10 形如这种形式的算式, 等式的右边的运算结果默认的都是int型的!因为等式右边有变量, 编译器无法确定变量的内容 ,因为它是变量!所以相加之后得到的int再默认强制转换成byte可能会损失精度. 而形如 a=4+5:这种常量的赋值,虽然 4 和 5 都默认的是int, 但都是常量,它们的值是确定的!所以如果 4+5的值超过了 byte的最大值的范围, 那就会编译出错!(也就是等式右边都是常量

Java中的值传递与“引用传递”

首先,Java没有 引用传递 这么一说. Java只有值传递,传递的都是值,基本数据类型传递的是值,引用类型传递的是地址值. 我来理一下这其中犹如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的,我们来看第一个例子: public static void main(String[] args) { int a = 1; int b = 4; System.out.println("Before : a=" + a + "," + "b=" +

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中. 在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享. 以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的.不过现在我觉得不是这样的. *****************************************************