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()); }