java的传值方式
目录
结论
首先说结论:java基本是值传递
分析
关于这个问题,其实一直以来都很有争论的,我也是为此查询了很多资料,在此发表一下自己的拙见。
我们从内存出发,两者的区别其实就是操作一块内存和新开辟一块内存的区别,知道了这个我们来看看“值传递”与“引用传递”这两个专有名词的意义
- 值传递: 会在传值过程中,将自身拷贝(复制)一份,赋给给新建的(临时)变量
- 引用传递:在传值过程中,本身其实并不会传递,传递的是实际参数的隐式引用
接下来我们分别试一下基本数据类型和引用数据类型(以下直接用对象称呼)以及String
基本数据类型
public static void updata(int value){
value = 100;
System.out.println("形参" +value);
}
public static void main(String[] args) {
int a = 50;
System.out.println("a" +a);
updata(a);
System.out.println("a在执行函数updata后:"+a);
}
执行结果
a50
形参100
a在执行函数updata后:50
基本数据类型为值传递,因此在方法内部修改的只是形参,在方法执行结束后,形参也被销毁,a并无任何改变
看看自己定义的对象
public class User {
int id;
String name;
int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '/'' +
", age=" + age +
'}';
}
}
public static void updataUser(User user){
user.setId(2);
user.setName("asd");
user.setAge(25);
System.out.println(user);
System.out.println(System.identityHashCode(user));
}
public static void main(String[] args) {
User user = new User(1,"qwe",24);
//没有重写toString,会打印地址
System.out.println(user);
System.out.println(System.identityHashCode(user));
updataUser(user);
System.out.println(user);
System.out.println(System.identityHashCode(user));
}
结果如下:
User{id=1, name=’qwe’, age=24}
460141958
User{id=1, name=’qwe’, age=24}
User{id=2, name=’asd’, age=25}
460141958
User{id=2, name=’asd’, age=25}
460141958
可以看出实参与形参的地址是一模一样的,数据修改是直接在源数据进行修改的
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "data1";
String str2 = new String("data2");
StringBuffer buffer = new StringBuffer("data3");
System.out.println("!!!!!1 str:=" + str + " str2:=" + str2
+ " buffer:=" + buffer.toString());
dealData(str, str2, buffer);
System.out.println("!!!!!2 str:=" + str + " str2:=" + str2 + " buffer:=" + buffer.toString());
}
private static void dealData(String str, String str2, StringBuffer buffer) {
str += "123";
str2 += "123";
buffer.append("123");
System.out.println("nerborn: str:=" + str + " str2:=" + str2 + " buffer:=" + buffer.toString());
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281567.html