栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java值传递

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java值传递

一、前言

按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。java中只有值传递。

二、示例 例1:
public static void main(String[] args) {
        int m = 10;
        int n = 20;
        swap(m,n);
        System.out.println("m="+m);
        System.out.println("n="+n);
    }

    public static void swap(int a,int b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a="+a);
        System.out.println("b="+b);
    }

执行结果:

 在 swap 方法中,a、b 的值进行交换,并不会影响到 num1、num2。因为,a、b 中的值,只是从 num1、num2 的复制过来的。当swap方法执行完后出栈,a和b会一起出栈。

 

 例2:
package LX;

public class TestDemo {
    private String name;
    private int age;
    public TestDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    public static void change(TestDemo s1, TestDemo s2){
        TestDemo temp = new TestDemo("张三",18);
        s1 = s2;
        s2 = temp;
        System.out.println(s1.toString());
        System.out.println(s2.toString());

    }
    public static void main(String[] args) {
        TestDemo t1 = new TestDemo("张三", 18);
        TestDemo t2 = new TestDemo("李四", 20);
        TestDemo.change(t1, t2);
        System.out.print(t1.toString());
        System.out.print(t2.toString());
    }
}

执行结果:

 change方法中拷贝的t1和t2的地址,方法结束出栈,s1和s2也会消失,所以t1和t2并不受影响

 例3:
package LX;

public class TestDemo {
    private String name;
    private int age;
    public TestDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    public static void change(TestDemo s1, TestDemo s2){
        TestDemo temp = new TestDemo("王五",20);
        temp.name = s1.name;
        s1.name = s2.name;
        s2.name = temp.name;

    }
    public static void main(String[] args) {
        TestDemo t1 = new TestDemo("张三", 18);
        TestDemo t2 = new TestDemo("李四", 20);
        TestDemo.change(t1, t2);
        System.out.print(t1.toString());
        System.out.print(t2.toString());
    }
}

执行结果:

 改变对象的属性并不难,这一次我们也是拷贝的是一个副本,拷贝的是TestDemo对象的副本,拷贝过来的对象和原对象指向同一内存的存储空间,所以当(t1,t2-- 拷贝)改变值的时候原person也改变值。

我们知道其实在栈内存当中原t1,t2里面存贮着堆内存当中的Person类的内存地址,而java在这里传输的是原t1,t2的存贮着的地址值

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759149.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号