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这种情况下千别希望原来对象被改变。

  • 相关阅读:
    sklearn 的 metrics
    转载:spring boot 中使用 jpa以及jpa介绍
    springboot 事件监听(@EventListener实现)
    多线程:创建线程和线程的常用方法
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    不定义新变量,交换两个变量的值
    理解WebSocket心跳及重连机制
    SpringBoot实现WebSocket
    批量打包成ZIP压缩文件
    RocketMQ入门教程
  • 原文地址:https://www.cnblogs.com/zziawanblog/p/5256415.html
Copyright © 2011-2022 走看看