zoukankan      html  css  js  c++  java
  • Java 函数的参数说

    java函数参数传递的到底是值还是引用对确实容易让人迷糊。而很多时候因为对这个问题的模糊甚至造成一些错误。最常见的说法是基本类型传的是值,对象传的引用。对于基本类型,大家都达成共识,没有什么可以争论的。但对于对象传递,还有一说是也是值传递。首先来看一个例子。一个简单类person,只有一个属性name,和一个人事系统。如下所示:

    public class Person{
    
        private String name;
    
        public Persion(String name){
            this.name = name;
        }
    
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
    }  

      

    public class PersonnalSystem{
    
        public static void changeName1(Persion person){
            person.setName("Bob");
           System.out.println("person name in changeName1: " person.getName());// Bob,被修改了
        }
      public static void changeName2(Persion person){
            Person anotherPerson = new Persion("Tom");
            person = anotherPerson;
           System.out.println("person name in changeName2: " person.getName());// Tom被修改了
        }
    
        public static void main(String[] agrs){
            Person person = new Persion("Lily");
            System.out.println("before change name person's name is"+person.getName);//Lily
            changeName2(person);
            System.out.println("after first change name person's name is"+person.getName);//被修改Bob
            changeName2(person);
            System.out.println("after second change name person's name is"+person.getName);//仍然是Bob,没有修改
        }
    }      

    运行这个程序可以看到,changeName1修改了person的名字,确实是传递引用。但是当把person传递到changeName2中虽然在方法内修改成功,但main函数中仍然是Bob没有修改。这似乎又是传值了。这是因为,对象传递过程中传递的是对象的地址,而非对象的引用,也不是对象的副本。假设刚开始person的地址为60,changeName1接收到的参数是地址60,所以修改是在地址60的地方进行的,因此对象改变。而在changeName2中新建anotherPerson的地址也许是65,但绝非是60.当把anotherPerson赋值给person时,只是将person所代码的60改变成65,后续的修改操作都是在65处进行的,因此对main(60)中的person无影响。

    所以总之来说我认为java参数传递过程是值传递。

    1. 基本类型传递值
    2. 引用类型传递的还是值,只不过是对象地址值,而非对象或副本。

    这种方式对于String,Integer, Double等immutable类型时,也是符合的。因为这些对象不可变,因此每次传递的都是值。当然如果非要认为对象是引用传递也未尝不可,但是首先要区别String这类不可变对象,其次还要主义changeName2这种情况下千别希望原来对象被改变。

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/zziawanblog/p/5256415.html
Copyright © 2011-2022 走看看