java参数传递

java参数与引用

总所周知,java虽然没有引用的概念,可是java在传入参数时,实际传入的参数对象是外部对象的引用,也就是从新生成一个指向外部对象的对象,只不过这两个对象指向的是同一片内存对象而已 ,咱们举例来讲明参数和引用的关系,咱们假定方法changeString为
        public void changeString(String a ){
                a = new String("I am b!" );
                System.out.println(a);
        }
        
那么当以下调用changeString(String a )方法时
        String a = new String("I am a!" );
        changeString(a);
        ......
java的作法实际等价于
        String a = new String("abc" );
        String b = a;
        changeString(b);
        ............
也就是说在被调用方法内部,传入参数对象和外部对象是不一样的对象;虽然二者指向的是同一个内存对象,可是很容易将二者的联系断开 ,好比咱们能够用以下的方法来测试一下
        String a = new String("I am a!" );
        System.out.println(a);
        //调用changeString方法
        changeString(a);
        System.out.println(a);
        
        结果应该为
        I am a!;
        I am b!;
        I am a!;
也 就是说外部对象a的值并无改变,这是由于在changeString(String a )方法内部,参数对象a并非外部对象a了(其实你若是把方法改为public void changeString(String b)这样更能理解参数对象b和外部对象a是两个对象了),参数对象a和外部对象a是两个对象,指向同一个内存对象new String("abc" ),可是在方法内部,当参数对象a被从新赋值时(a = new String("b" ))时,参数对象
a被从新指向一个新的内存对象new String("I am b!" ),这样参数对象a和外部对象a断开了关系
 ,再没有任何联系了,所以外部对象a的值也不可能有什么变化。

   经过以上说明,你应该对参数和引用有所理解;说到这里,咱们要注意变量的赋值,当使用"="为变量赋值时,通常都是为变量a从新指定一个新的内存对象,所以当用"只读对象 "作为参数时,外部对象的值安全的,这些对象和数据包括为
                基本类型,好比int,char
                只读对象,好比String,Integer等 
   也就是说你不可能经过调用方法来试图改变原有对象的值,你能经过调用changeValue(int a,int b)来交换a和b的值么?
        

    若是某些时候你须要在方法内部改变原有对象的值怎么办,办法很简单,不要为参数对象指向新的内部对象,并在此基础上,调用参数对象的方法来改变内存对象,好比,咱们考虑以下方法
        public void changeBufferValue(StringBuffer sb){
                sb.append("I am b!");
        }
        
以下调用
        StringBuffer a = new StringBuffer("I am a!");
        System.out.println(a.toString());
        changeBufferValue(a);
        System.out.println(a.toString());

输入结果应该为
        I am a!
        I am a!I am b!

若是方法写成
        public void changeBufferValue(StringBuffer sb){
                sb = new StringBuffer("I am b!");
        }
你应该知道结果是什么了吧!,所以当你指望方法内部能改变传入变量的值时,慎用"="号为参数对象从新赋值。java

一、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,若是你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
二、对于对象类型,也就是Object的子类,若是你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,可是若是你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
 
代码以下:
public class Tester {
public static void main(String[] args) {
int primitive = 2;
changePrimitive(primitive);
//primitive的值依然是2
MyClass myClass = new MyClass();
changeObject(myClass);
//myClass仍然指向的是执行changeObject以前的那个对象
//可是myClass.i等于3了
}安全

public static void changePrimitive(int primitive) {
primitive = 3;
}app

public static void changeObject(MyClass myClass) {
myClass.i = 3;
myClass = new MyClass();
}
}测试

class MyClass {
int i;
}spa

对于远程调用,不管是什么类型,调用结束后,传入的参数和之前没用任何变化(固然前途是直接调用远程方法,若是中间通过其它的Proxy类或者 Facade类,不能保证那些类对对象没用修改)。至因而经过Locale接口进行调用的,我不太清楚是否属于远程调用。之后肯定了再来更新。对象

相关文章
相关标签/搜索