4-2.值传递

           

package property;
public class ValueTest {

    private String field;
    
    public static void main(String[] args) {
        /*
         * 
         * -----------------方法参数-----------------
         * 
         * 按值调用:表示方法参数接受的是调用者提供的值
         * 按引用调用:................................................提供的变量地址
         * 
         * Java是值传递
         * 
         * 对象引用和值引用
         * 
         * 对象引用是按照值传递的
         * 
         */

        /*
         * 值引用
         * 
         * Java程序设计是按值引用,方法得到是所有参数值的一个拷贝,并不能修改传递给他的参数变量的内容
         * 
         * 执行步骤:
         * 1.x被初始化a的值的一个拷贝                         
         * 2.x*5 =10 ,a的值仍是2                                         
         * 3.方法结束后x变量不再使用
         */                   

        int a = 2;
        method1(a); 
        System.out.println("a=="+a);
        
        String b = "a";
        method2(b);
        System.out.println("b=="+b);
        
        String c = new String();
        c = "c";
        method2(c);
        System.out.println("c=="+c);
        
        /*
         * String类型不是基本数据类型为什么不能改变值:新开辟一块内存
   * String是final修饰的
   * 先拷贝x的一份对象变量为y,方法内给拷贝变量赋值,赋值操作是新开辟一片内存空间,引用赋值给y,x的引用并没有改变
         */
        String x = "5";
        method(x);
        System.out.println("x--->"+x);
        /*
         * 方法参数有两种类型:
         * 1.基本数据类型
         * 2.对象引用
         * 
         * 一个方法不能修改一个基本数据类型的参数,下面看对象引用
         */
        
        
       /*
        * 对象引用
        * 
        * 1.拷贝一份va的值赋给x,这是对象引用,指向同一个对象
        * 2.x.field="ss";
        * 3.结束后x不再使用,va继续指向原来的对象,值改变
        */
        
         ValueTest va =  new ValueTest();
         va.setField("aa");
         method3(va);
         System.out.println(va.getField());  
        
         /*
          * 1.分别拷贝一份对象变量赋值
          * 2.x,y指向对象交换,但是v1,v2没变
          * 3.结束后x,y不再使用了
          */


         ValueTest v1 = new ValueTest();
         v1.setField("v1");
         ValueTest v2 = new ValueTest();
         v2.setField("v2");
         method4(v1, v2);
         System.out.println(v1.getField()); 
         System.out.println(v2.getField()); 
         
    }
    
    private static void method(String y){
        y= "6";
    }
    
    private static void  method1(int x){
        x = 5*x;
        System.out.println("x=="+x);  
    }

    private static void  method2(String x){
        x = "aaa";
        System.out.println("x=="+x);  
    }

    private static void method3(ValueTest x){
        x.field = "ss";
        System.out.println(x.getField()); 
    }
    
    private static void method4(ValueTest x,ValueTest y){
        ValueTest temp = y;
        y = x;
        x = temp;
    }
    
    
    
    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
    
}
原文地址:https://www.cnblogs.com/lxh520/p/8134578.html