zoukankan      html  css  js  c++  java
  • java中值传递和引用传递

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
    引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
    下面举例说明:
    传值---传递基本数据类型参数

    public    class           PassValue{
        static void exchange(int a, int b){//静态方法,交换a,b的值
            int temp;
            temp = a;
            a = b;
            b = temp;
        }
        public static void main(String[] args){
           int i = 10;
           int j = 100;
           System.out.println("before call: " + "i=" + i + "	" + "j = " + j);//调用前
            exchange(i, j);                                                                    //值传递,main方法只能调用静态方法
            System.out.println("after call: " + "i=" + i + "	" + "j = " + j);//调用后
        }
    }


    运行结果:
            before call: i = 10        j = 100
            after    call: i = 10        j = 100
    说明:调用exchange(i, j)时,实际参数i,j分别把值传递给相应的形式参数a,b,在执行方法exchange()时,形式参数a,b的值的改变不影响实际参数i和j的值,i和j的值在调用前后并没改变。
    引用传递---对象作为参数
    如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

    class Book{
        String name;
        private folat price;
        Book(String n,    float ){                //构造方法
            name = n;
            price = p;
        }
        static  void  change(Book a_book,    String n,    float p){    //静态方法,对象作为参数
                a_book.name = n;
                a_book.price = p;
        }
        public void output(){        //实例方法,输出对象信息
            System.out.println("name: " + name + "	" + "price: " + price);
        }
    }
     public class PassAddr{
        public static void main(String [] args){
            Book b = new Book("java2",    32.5f);
            System.out.print("before call:	");        //调用前
            b.output();
            b.change(b,    "c++",    45.5f);            //引用传递,传递对象b的引用,修改对象b的值
            System.out.print("after call:	");            //调用后
            b.output();
        }
    }


    运行结果:
            before    call:    name:java2        price:32.5
            after       call:    name:c++          price:45.5
    说明:调用change(b,"c++",45.5f)时,对象b作为实际参数,把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象,即该对象有两个引用名:b和a_book。在执行方法change()时,对形式参数a_book操作就是对实际参数b的操作。

    Java面试题:

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  

    答案基本上是:值传递

    说明:得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容” 

    ----------------------------------------------------

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。

    引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,

    在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。

    值传递——基本数据类型作为参数(如:String,int)

    1. public static void changeInt(int a, int b){  
    2.     int tmp;  
    3.     tmp = a;  
    4.     a = b;  
    5.     b = tmp;  
    6. }  

    参数调用:

    1. // int类型,值传递  
    2. int a = 123;  
    3. int b = 456;  
    4.   
    5. printInt(a, b);  
    6. changeInt(a, b);  
    7. printInt(a, b);  

    执行结果:

    a = 123; b = 456
    a = 123; b = 456
    ----------------------------------------------------

    引用传递——对象或数组作为参数(如:Person,Array)

    1. class Person{  
    2.     String name;  
    3.     int age;  
    4.       
    5.     public Person(String name, int age){  
    6.         this.name = name;  
    7.         this.age  = age;  
    8.     }  
    9.       
    10.     public void changePerson(Person person, String name, int age){  
    11.         person.name = name;  
    12.         person.age  = age;  
    13.     }  
    14.       
    15.     public void printPerson(Person person){  
    16.         System.out.println("name = " + person.name + "; age = " + person.age);  
    17.     }  
    18. }  

    参数调用:

    1. // 对象,引用传递  
    2. Person p = new Person("张三", 20);  
    3.   
    4. p.printPerson(p);  
    5. p.changePerson(p, "李四", 30);  
    6. p.printPerson(p);  

    执行结果:
    name = 张三; age = 20
    name = 李四; age = 30

    ----------------------------------------------------

    完整示例:

    1. package com.val_ref;  
    2.   
    3. // Person类  
    4. class Person{  
    5.     String name;  
    6.     int age;  
    7.       
    8.     public Person(String name, int age){  
    9.         this.name = name;  
    10.         this.age  = age;  
    11.     }  
    12.       
    13.     public void changePerson(Person person, String name, int age){  
    14.         person.name = name;  
    15.         person.age  = age;  
    16.     }  
    17.       
    18.     public void printPerson(Person person){  
    19.         System.out.println("name = " + person.name + "; age = " + person.age);  
    20.     }  
    21. }  
    22.   
    23. class iArray{  
    24.       
    25.     public iArray(){  
    26.   
    27.     }  
    28.       
    29.     public void reverseArray(int []array){  
    30.         int tmp;  
    31.         int len = array.length;  
    32.         for(int i=0; i<len/2; i++){  
    33.             tmp = array[i];  
    34.             array[i]= array[len-1-i];   
    35.             array[len-1-i] = tmp;  
    36.         }  
    37.     }  
    38.       
    39.     public void printArray(int []array){  
    40.           
    41.         for(int i=0; i<array.length; i++){  
    42.             System.out.print(array[i] + "  ");  
    43.         }  
    44.         System.out.println();  
    45.     }  
    46. }  
    47.   
    48.   
    49. public class testValue {  
    50.       
    51.     public static void main(String []args){  
    52.   
    53.         // 对象,引用传递  
    54.         Person p = new Person("张三", 20);  
    55.           
    56.         p.printPerson(p);  
    57.         p.changePerson(p, "李四", 30);  
    58.         p.printPerson(p);  
    59.   
    60.         // 对象,引用传递  
    61.         int []array = new int[5];  
    62.         for(int i=0; i<array.length; i++){  
    63.             array[i] = i+1;   
    64.         }  
    65.         iArray obj = new iArray();  
    66.         obj.printArray(array);  
    67.         obj.reverseArray(array);  
    68.         obj.printArray(array);  
    69.           
    70.           
    71.         // String类型,值传递  
    72.         String name1 = "张三";  
    73.         String name2 = "李四";  
    74.   
    75.         printString(name1, name2);  
    76.         changeString(name1, name2);  
    77.         printString(name1, name2);  
    78.   
    79.         // int类型,值传递  
    80.         int a = 123;  
    81.         int b = 456;  
    82.   
    83.         printInt(a, b);  
    84.         changeInt(a, b);  
    85.         printInt(a, b);  
    86.     }  
    87.       
    88.     // String类型  
    89.     public static void changeString(String name1, String name2){  
    90.         String tmpName;  
    91.         tmpName = name1;  
    92.         name1 = name2;  
    93.         name2 = tmpName;  
    94.     }  
    95.   
    96.     public static void printString(String name1, String name2){  
    97.         System.out.println("name1 = " + name1 + "; name2 = " + name2);  
    98.     }  
    99.       
    100.     // int类型  
    101.     public static void changeInt(int a, int b){  
    102.         int tmp;  
    103.         tmp = a;  
    104.         a = b;  
    105.         b = tmp;  
    106.     }  
    107.   
    108.     public static void printInt(int a, int b){  
    109.         System.out.println("a = " + a + "; b = " + b);  
    110.     }  
    111. }  

    执行结果:
    name = 张三; age = 20
    name = 李四; age = 30
    1  2  3  4  5  
    5  4  3  2  1  
    name1 = 张三; name2 = 李四
    name1 = 张三; name2 = 李四
    a = 123; b = 456
    a = 123; b = 456

    推荐参考:

    java中的值传递和引用传递

    Java 是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递

    Java 的==和Equals比较

  • 相关阅读:
    ubuntu11.04解决root不能登录的问题
    应用C预处理命令
    WINCE6.0在控制面板添加控制面板应用程序
    嵌入式系统开发
    WINCE6.0下开始菜单的“挂起(suspend)”是否可见及阻止系统进入睡眠模式
    WINCE6.0更换桌面壁纸和图标
    ubuntun_11.04安装
    WINCE开发更安全可靠设备驱动的最佳实践
    WINCE源代码配置文件
    TS2003基于触摸屏的应用
  • 原文地址:https://www.cnblogs.com/shininguang/p/4776037.html
Copyright © 2011-2022 走看看