(此處已添加小程序,請到今日頭條客戶端查看)
首先回答:在Java中參數的傳遞是按值傳遞的。按值傳遞的意思實際上就是傳遞的是變量的一個副本。既然是副本,那麽在傳遞的那個方法中對這個副本的修改,並不影響那個變量。
然後開始用例子說明:
public static void main(String[] args) { int x = 1; System.out.println(“main()調用test前x=”+x); test(x); System.out.println(“main()調用test前x=”+x); } private static void test(int x) { x*=3; System.out.println(“test()中x=”+x); }
1)x是基本類型的局部變量,所以它存放在棧中
2)x作爲參數傳遞給test,其實傳遞的是x的一個副本
3)既然是副本,那麽test方法中對x的修改並不影響main中的。
例2:
public static void main(String[] args) { P p1 = new P(23); P p2 = new P(33); System.out.println(“main()調用test前p1的age=”+p1.getAge()); System.out.println(“main()調用test前p2的age=”+p2.getAge()); test(p1,p2); System.out.println(“main()調用test前p1的age=”+p1.getAge()); System.out.println(“main()調用test前p2的age=”+p2.getAge()); } private static void test(P p1,P p2) { P tmp = p1; p1 = p2; p2 = p1; }
1)p1作爲引用類型的局部變量,存放在棧中。
2)p2作爲引用類型的局部變量,存放在棧中。
3)p1和p2作爲參數傳遞給test,其實是傳遞的p1的副本和p2的副本。
4)既然是副本,那麽在test中的改變並不影響main中的p1和p2
5)從堆棧上可以看出:你堆test中的p1和p2進行交換,並不能影響到main中的p1和p2
例3:
public static void main(String[] args) { P p1 = new P(23); System.out.println(“main()調用test前p1的age=”+p1.getAge()); test(p1); System.out.println(“main()調用test前p1的age=”+p1.getAge()); } private static void test(P p1) { p1.setAge(99); }
1)main中的p1和test中的p1都是指向同一個對象。
2)test中修改的只是對象中的屬性值,並不是修改p1本身。
3)從堆棧圖上可以看出:
(此處已添加小程序,請到今日頭條客戶端查看)