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

  • 相关阅读:
    Delphi开发组件
    WPF界面开发.NET环境该如何配置?不知道VS版本支持的看过来
    Map控件是如何支持矢量切片的?DevExpress WPF界面开发者必看!
    数据可视化新方式,SankeyDiagramControl类的使用你不能错过!(Part 1)
    VCL界面开发工具!DevExpress VCL v20.1.7全新出发
    如何使用自动生成的序列创建3D图表?DevExpress WPF有妙招(Part 3)
    如何使用Kendo UI在Vue.js中轻松构建UI组件?
    php结合redis实现高并发下的抢购、秒杀功能
    书写高质量SQL的30条建议
    php 通过openresty搭载负载均衡
  • 原文地址:https://www.cnblogs.com/zziawanblog/p/5256415.html
Copyright © 2020-2023  润新知