首先 自己寫了個小測試,代碼如下
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.將子類的內存地址賦值給棧中的引用對象。