java 調用函數傳參時候修改參數的值


 

首先 自己寫了個小測試,代碼如下

 1 import java.util.ArrayList;
 2 
 3 public class QuoteTest {
 4     public static void main(String[] args){
 5         //test String
 6         String str = "value";
 7         TestClass tc = new TestClass();
 8         tc.ChangeVlaue(str);
 9         System.out.println("str now is"+str);
10         //test int
11         int num = 0;
12         tc.ChangeVlaue(num);
13         System.out.println("num now is"+num);
14         //test objectclass
15         TestClass testClass = new TestClass();
16         System.out.println("testClass now is"+testClass+";num:"+testClass.num);
17         tc.ChangeVlaue(testClass);
18         System.out.println("testClass now is"+testClass+";num:"+testClass.num);
19         //test Arrry
20         ArrayList<String> liststr = new ArrayList<String>();
21         liststr.add("str1");
22         tc.ChangeVlaue(liststr);
23         System.out.println("liststr now is"+liststr);
24     }
25 }
26 
27 class TestClass{
28     public TestClass(){
29         System.out.println("TestClass constructor ");
30     }
31     int num = 0;
32     public void ChangeVlaue(String str){
33         str = "changed value";
34     }
35     public void ChangeVlaue(int num){
36         num ++;
37     }
38     public void ChangeVlaue(TestClass testClass){
39         testClass.num ++;
40         testClass = new TestClass();
41         testClass.num ++;
42         //hangeVlaue(testClass.num);
43     }
44     public void ChangeVlaue(ArrayList<String> liststr) {
45         liststr.add("str2");
46     }
47 }

輸出結果如下:

TestClass constructor
str now isvalue
num now is0
TestClass constructor
testClass now isTestClass@2503dbd3;num:0
TestClass constructor
testClass now isTestClass@2503dbd3;num:1
liststr now is[str1, str2]

在調用函數傳入值時/會修改參數的內部值屬性如屬性和集合中的值,但參數的地址不會發生改變,一些簡單的類型更不會被修改值,

 

測試時存在一個疑惑:

在代碼38行傳過來的參數,在給其賦值為什么地址依然是@2503dbd3 沒有發生變化,new一個對象的原理是什么? 並先修改39的num時,18行調用時會顯示num++; 但若是放在40后面,則不會++,但這兩個的地址不是相同的嗎?

new 一個對象:

1.javac編譯.java源文件形成.class字節碼文件; 
2.new SubClass()對象時,先檢查有沒有父類,有父類,類加載器(ClassLoader)先將父類的Class文件讀入內存,創建一個java.lang.Class對象,然后加載子類,類加載器將子類的Class文件讀入內存,創建一個java.lang.Class對象; 
3.先初始化父類的靜態屬性,再初始化父類的靜態代碼塊; 
4.再初始化子類的靜態屬性,再初始化子類的靜態代碼; 
5.在堆內存中分配內存空間,分配內存地址,此時是因為父類的特有屬性才在堆內存中為父類對象分配空間。 
6.初始化父類的特有屬性。 
7.初始化父類的構造代碼塊。 
8.初始化父類對象相應的構造方法。 
9.在堆內存中分配內存空間,分配內存地址,此時是因為子類的特有屬性才在堆內存中為子類對象分配空間的。 
10.初始化子類的特有屬性。 
11.初始化子類的構造代碼塊。 
12.初始化子類相應的構造方法。 
13.將子類的內存地址賦值給棧中的引用對象。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM