1.成員變量與局部變量的區別:
①定義的位置不同:
成員變量定義在類中;
局部變量定義在方法中;
②在內存中的位置不同:
成員變量在堆中
局部變量在棧中
③生命週期不同:
成員變量隨着對象的出現而出現,隨着對象的消失而消失
局部變量隨着方法的調用而出現,隨着方法的彈棧而消失
④初始化不同:
成員變量隨着對象的出現而分配空間,有默認值
局部變量隨着被使用而分配空間,若只聲明不開闢內存空間,沒有默認值
2.傳說中的匿名對象
假設有個Car類,有num,color 2個成員變量,和一個run()方法可以打印num的值,這裏有2中寫法:
①:Car car = new Car();
car.color="red";
car.num="5";
car.run();
②new Car().color="red";
第二種寫法就是匿名對象
侷限性:第②句執行完後該對象就變成了垃圾,因爲並沒有引用指向該對象,垃圾回收器將回收該對象所佔內存。
使用匿名對象的場景:當對對象的方法進行調用,並且只需要調用一次時,可以使用之
3.繼承的實質:
繼承的實質是拷貝一份父類所有的成員變量和方法到自己裏面,其中包括父類的私有成員變量和方法。然後便與原本的父類沒有了任何關係,子類的super()方法,構造的實際也只是拷貝到自己內部的父類的代碼構造出的對象。如圖:
當在main函數中執行:
Student s= new Student();
s.printNum();
Person p =new Person();
p.printNum();
會發現p.printNum()的結果仍然是10;子類中的super.num=20並不能改變原本父類的num屬性,改變的只是拷貝到自己內部的父類代碼構造出來的對象的num屬性.
而且,若父類Person有一個私有的成員變量,子類繼承時也會一起拷貝過去,只是受訪問權限控制,子類不能直接訪問,但若父類提供一個公有的get方法,就可以通過該方法獲取該私有屬性,同樣獲得的也是拷貝的代碼構造的對象所擁有的該屬性。總之,無論如何,子類與它的繼承的那個父類已經沒有了聯繫,它不能改變原本那個父類的狀態,它對父類的操作實際上都只是在操作它拷貝的那個副本而已。
當子類與父類有重名的成員或者方法時,並且訪問權限不是private時,子類繼承時會隱藏它們,若想調用之,可以用super關鍵字
4.構造代碼塊和局部代碼塊
構造代碼塊:存放各個構造函數中的相同函數,每次構造對象,構造代碼塊中的代碼都會被執行,在類中用{}包括的代碼就是構造代碼塊
局部代碼塊:可以控制局部變量的生命週期,用於優化內存空間,在main中用{}包括的代碼就是構造代碼塊