【关键词】
【问题】
· 加深对基本类型和引用类型的理解;
【效果图】
【分析】
- 参见最后的
【参考资料】
【解决方案】
【代码】
public class Main {
public void test() throws Exception {
System.out.println("\nint:=================");
int i = 2;
System.out.println("before:" + i);
change1(i);
System.out.println("after:" + i);
System.out.println("\nInteger:=================");
Integer integer = 3;
System.out.println("before:" + integer);
change2(integer);
System.out.println("after:" + integer);
System.out.println("\nString:=================");
String str = new String("xxx");
System.out.println("before:" + str);
change3(str);
System.out.println("after:" + str);
System.out.println("\nString[]:=================");
String[] array = new String[] { "a", "b", "c" };
System.out.println("before:" + array[0]);
change4(array);
System.out.println("after:" + array[0]);
System.out.println("\nBook:=================");
Book book = new Book("book1");
System.out.println("before:" + book.name);
change5(book);
System.out.println("after:" + book.name);
System.out.println("\nint[]:=================");
int[] int_array = new int[] { 1, 2, 3 };
System.out.println("before:" + int_array[0]);
change6(int_array);
System.out.println("after:" + int_array[0]);
}
public void change1(int i) {
i = 4;
}
public void change2(Integer integer) {
integer = (Integer) 8;
}
public void change3(String str) {
str = new String("yyy");
}
private void change4(String[] array) {
array[0] = "A";
}
private void change5(Book book) {
book.name = "book2";
}
private void change6(int[] int_array) {
int_array[0] = 10;
}
private class Book {
public String name;
Book(String name) {
this.name = name;
}
}
}
【参考资料】
-
java到底是值传递还是引用传递?
(其中“三:调用方法时发生了什么?”讲的很清晰)
-
java 中 Integer 传参方式的问题,不是说Integer是引用传递么?但为什么不会改变it
-
String 和 Integer 传递给方法时到底是不是传递引用??!!
http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object.
当参数是引用类型时,你能通过调用该引用所指向的对象本身的方法来改变对象自身,但是,你并不能改变该引用。(你改变的只能是引用所指向的对象,而不是引用。所以,仍然是值传递。) -
不管你传的是什么,传过去的都只是一个副本而已,这个副本作为方法的局部变量保存在栈中。
如果传的是基本数据类型,修改这个值并不会影响作为参数传进来的那个变量,因为你修改的是方法的局部变量,是一个副本。
如果传的是一个对象的引用,也是一样的,也是一个副本,但是这个副本和作为参数传进来的那个引用指向的是内存中的同一个对象,所以你通过这个副本也可以操作那个对象。但是如果你修改这个引用本身,比如让他指向内存中的另外一个对象,原来作为参数传进来的那个引用不会受到影响。
我觉得弄明白这些就行了,说值传递或引用传递都无所谓,但是说值传递更适合一些,这个值可以是引用也可以是基本数据类型。