1.方法重載
和C++的函數重載一樣,主要是實現多個相同的函數名,但是參數表不同.
參數表不同主要有以下幾種
- 1) 參數個數不同
- 2) 參數類型不同
- 3) 參數順序不同
2.類和對象
類class
用來描述一個對象的結構,但是類不能直接使用,必須生成對象后才能使用
對象
通過類來生成的一個對象, 根據類生成的對象都具備相同的行為(class成員函數),但是屬性(class成員變量)不一定相同.
3.對象引用分析
示例如下:
class People { String name; public void print(){ System.out.println("name:"+name); } } public class Test{ public static void main(String args[]){ People PeopleA = new People(); //在棧空間定義一個peopleA地址,然后通過new在堆空間創建一段內存,使PeopleA引用它 PeopleA.name ="小張"; People PeopleB = PeopleA; //在棧空間定義一個peopleB地址,然后使peopleB引用peopleA所指向的堆空間. PeopleB.print(); } }
打印如下:
可以看到通過引用,可以讓兩個對象指向同一塊堆空間
4.類的封裝
成員變量訪問權限有以下4種:
- 在JAVA中,成員變量權限默認是為default (和C++不同,C++默認為private).
- 上圖的同一包,表示在同一個目錄中的類成員訪問權限
包的定義以及使用參考: 13.JAVA-包package、import使用
接下來我們來看看default區別
定義common.demo.Test類:
package common.demo ; //指定生成的class文件位於common/demo/目錄下 public class Test { static int i=10; //默認為default權限 public static void main(String args[]){ System.out.println("Hello World"); } }
定義common.demo.CallTest類,此類和common.demo.Test類位於同一包:
package common.demo ; //指定生成的class文件位於common/demo/目錄下 import common.demo.*; //導入common.demo包里的所有類 public class CallTest { public static void main(String args[]){ System.out.println("i:"+Test.i); //打印靜態屬性i } }
運行打印:
然后我們屏蔽" package common.demo ;"后,則CallTest類不在common.demo包里了,所以訪問Test.i將會報錯,編譯后如下圖所示:
5.構造方法
- 構造方法的作用,用來類對象實例化的時候,初始化其屬性(成員變量)所准備的
- 如果類中沒有定義構造方法,編譯器會默認提供一個無參數的構造方法。
- 構造方法可以帶參數,但是不能有任何返回類型的聲明
- 構造方法不能定義static類型,因為構造方法是在運行期間才會去生成對象
- 構造方法支持多個方法重載
示例:
class People { public People(String name){ //構造方法 this.name = name; //類中有個隱藏的this屬性,它永遠指向當前對象 } public void print(){ System.out.println("name:"+name); } } public class Test{ public static void main(String args[]){ People PeopleA = new People("小張"); //調用 構造方法People(String name) 來初始化屬性 PeopleA.print(); } }
6.析構方法
- 在java中,也有析構方法,不過和C++中類前面加~號的不一樣。
- 在java中,如果需要自己寫析構方法,則在類中定義一個void finalize()方法.
- finalize必須是protected權限的,因為java中的類,默認都是繼承於Object,所以重寫析構方法時,需要和Object的一致
PS:一般用不到它,因為java有自動內存回收機制
計數當前共有多少個對象示例,代碼如下:
class Counter { private static int cnt = 0; public Counter() { cnt++; } public static void printCnt() { System.out.println("Cnt:"+cnt); } protected void finalize() { cnt--; } } public class Test{ public static void main(String args[]){ Counter cnt1 = new Counter(); Counter.printCnt(); Counter cnt2 = new Counter(); Counter.printCnt(); cnt2 = null; //將cnt2置為null try { System.gc(); //告訴回收站,有垃圾,需要清理內存 Thread.currentThread().sleep(1000); //休眠1000毫秒,因為需要給finalize()方法提供執行時間 Counter.printCnt(); //釋放掉cnt2后,則輸出1(因為還有cnt1存在) } catch(InterruptedException e) //sleep休眠可能產生InterruptedException異常.所以需要用try捕捉 { e.printStackTrace(); //打印回溯信息 } } }
運行打印:
下章學習:4.JAVA-數組、String詳解