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
    

    感谢此文章的帮助

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/to-red/p/14297656.html
Copyright © 2011-2022 走看看