zoukankan      html  css  js  c++  java
  • Java中只有值传递

    在Java中只有值传递。

    值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

    引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    值传递中有几个例子,先一一的解释一下。

    1. 数值类型
    public static void main(String[] args) {
       ParamTest pt = new ParamTest();
    
       int i = 10;
       pt.pass(i );
       System.out.println("print in main , i is " + i);
    }
    
    public void pass(int j) {
       j = 20;
       System.out.println("print in pass , j is " + j);
    }
    

    输出:

    print in pass , j is 20
    print in main , i is 10
    

    在这个例子中,j的改变没有影响到i这个变量。

    1. 对象
    public static void main(String[] args) {
       ParamTest pt = new ParamTest();
    
       User hollis = new User();
       hollis.setName("Hollis");
       hollis.setGender("Male");
       pt.pass(hollis);
       System.out.println("print in main , user is " + hollis);
    }
    
    public void pass(User user) {
       user.setName("hollischuang");
       System.out.println("print in pass , user is " + user);
    }
    

    这个输出

    print in pass , user is User{name='hollischuang', gender='Male'}
    print in main , user is User{name='hollischuang', gender='Male'}
    
    1. 字符串对象
    public static void main(String[] args) {
       ParamTest pt = new ParamTest();
    
       String name = "Hollis";
       pt.pass(name);
       System.out.println("print in main , name is " + name);
    }
    
    public void pass(String name) {
       name = "hollischuang";
       System.out.println("print in pass , name is " + name);
    }
    

    这个输出

    print in pass , name is hollischuang
    print in main , name is Hollis
    

    有人会说,第2个例子改变了不就是引用传递吗,并不是。综合2和3的例子来看

    在例子2中

    实际上,这个并没有直接传递地址,而是两个不同的对象,指向同一个引用。在main中的hollis是一个对象,他有自己的地址,值是一个引用;在pass方法中的user又是另一个对象,他也有自己的地址(和hollis的地址不一样),他的值也是一个引用。从main中传递到pass中,是hollis的值(一个引用)赋给user的值(一个引用)。并没有直接将hollis的地址赋值给user。所以还是值传递,只不过这个值是一个引用。当修改user时,实际修改了引用中的内容,那么hollis中引用的对象中的内容自然也会变。

    在例子3中

    这里main中没有改变是因为赋值了一个新的对象给user,user指向了一个新的引用(String的性质),而不是修改了原引用中的值,所以user的改变没有影响到main中的对象。如果第3个例子中把String换成StringBuilder,并使用append方法,那么引用就不会改变,得到的结果就类似于例子2。

    演示:

    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hello");
        change(stringBuilder);
        System.out.println(stringBuilder.toString());
    }
    
    public static void change(StringBuilder stringBuilder) {
        stringBuilder.append(",world");
        System.out.println(stringBuilder.toString());
    }
    
    hello,world
    hello,world
    

    感谢此文章的帮助

  • 相关阅读:
    [日常摸鱼]UVA393 The Doors 简单计算几何+最短路
    [日常摸鱼]bzoj3122 [Sdoi]2013 随机数生成器
    [日常摸鱼]积性函数求和——杜教筛
    [OI笔记]NOIP2017前(退役前)模拟赛的总结
    [日常摸鱼]poj2417 DiscreteLoggingBSGS算法
    [日常摸鱼]UVA11424&11426 GCD Extreme
    [日常摸鱼]JSOI2008最大数
    [日常摸鱼]HDU1724 Ellipse自适应Simpson法
    原码、补码、反码的作用和区别
    Fibonacci序列or兔子序列
  • 原文地址:https://www.cnblogs.com/to-red/p/14297656.html
Copyright © 2011-2022 走看看