java 值传递简单分析(以String和pojo对象举例)
先看代码:
public static void main(String[] args) { String str = "abc"; User user = new User(); user.setName("张三"); user.setAge(10); run(str, user); System.out.println(str); System.out.println(user.getName()); } public static void run(String str, User user) { str = "cd"; user.setName("李四"); }
大家觉得输出会是怎样的呢?
正确的输出是:
abc 李四
有的童鞋可能会懵逼,有的童鞋可能觉得这个太简单了吧,这还要单独写一篇文章。
Java新手可能有点不太明白这个的原理,很多用Java多年的老手,可能平时主要是写业务代码,然后平时呢,也不爱看书,不注重基础的童鞋,可能也不明白这个的原理。
所以,我要是问你这个其中的原理,为什么会是这样,你能答上来吗。
废话不多说,下面开始分析原理:
这样是否就明白了,在run方法进行str = "cd"的操作根本就不会影响到main方法中的str所指向的值。
形参:是指在定义方法时列出的参数,用来接收方法调用时传递过来的数据。简单地说,我们定义方法时写出的那些参数都是形参。形参只有在被调用时才会被分配内存空间,一旦调用结束就会释放占用的空间,因此仅在方法内有效,属于一种局部变量,针对形参的改动无法影响到方法外。
实参:在调用有参方法时,主调方法和被调方法之间需要进行数据传递。被调用方法名后面括号中的参数就是“实际参数”,所以实参是调用方法时实际传递给该方法的参数。实参会被预先创建并赋予确定的值。
下面再来看user的图:
这样是不是就一目了然了,str与user的结果表现不一样的原因也就在这里了。
大家平时也要多举一反三,这样才能学到东西。
重要知识点:
Java语言中参数传递的是拷贝,基本类型传递的是值的拷贝,引用类型传递的是内存地址的拷贝。当一个对象实例作为一个参数被传递到方法中,参数的值就是对该对象的内存地址。所以Java的参数传递都是值传递,而没有引用传递!即使是引用类型的参数,也是值传递,而这个值,实际上是引用对象的引用地址。
总之,在Java方法传参时,无论传递的参数是基本类型还是引用类型,都是值传递!切记一点,Java里面只有值传递,没有引用传递!