Java語言的基本結構
1.每個java程式可以包含多個類的定義,但是只能有一個類是public的,而且java源檔案必須以其中public類型的類的名字命名。
2.關於包的引入:(1)儘管包名中的“.”,能夠體現各個包中間的階層,但是每個包是獨立的,頂層包並不包含子包中的類。(2)package和import的順序是固定的,package語句必須位於第一行。
3.java語言要求java源檔案的存放路徑與檔案中聲明的包名存在對應的關係。例如,Monkey.java中的Monkey類位於hgs.angel包中,與此對應,Monkey.java檔案位於src目錄的hgs/angel子目錄下 .
4.方法覆蓋與方法重載:(1)覆蓋要求參數簽名必須一致,方法重載要求參數簽名必須不一樣(2)方法覆蓋要求傳回型別必須一致, 方法重載對此沒有要求 (3)方法覆蓋對方法的存取層級及拋出的異常有特殊的要求.
5.多態 (1)對於一個參考型別的變數, java編譯器按照它聲明的類型進行處理. 例如: Base who=new Sub(); who.subVar; who.subMethod()使用子類的屬性和方法都會出錯. (2)對於一個參考型別的對象, java虛擬機器按照它實際指向對象的類型來進行處理. Creature c=new Dog(); Animal a=(Animal)c;//正常, c指向的其實是Dog對象 Dog d=(Dog)c;//正常 Cat cat=(Cat)c;//Dog對象不能轉換為Cat對象. (3)綜合1,2, java語言允許某個類型的引用變數引用子類的執行個體,且可以對這個引用對象進行類型轉換(見(2), 按照實際指向物件類型判斷). (4)綁定規則: ●執行個體方法與實際引用對象的執行個體方法綁定; ●靜態方法與宣告類型的靜態方法綁定; ●變數(成員/靜態)與宣告類型的變數綁定.
6.== & equal: ==兩邊都是引用對象時, 必須引用同一個對象, 結果才是true; ●Object的equal()與==的比較一樣, ●JDK庫中,一些類覆蓋了Object的方法, 如果兩個物件類型一致, 並且內容一致, 就是true.
7.一個類的執行個體, 可以看做是直接父類和間接父類的執行個體. m instanceof Object 必定為true.
8.abstract ●修飾類, 表示抽象類別, 不能被執行個體化; 修飾方法, 表示抽象方法, 不提供具體的實現. ●抽象類別中可以沒有抽象方法, 但是抽象方法中一定有抽象類別 ●抽象類別不能被執行個體化, 但是可以建立一個引用, 引用非抽象子類的執行個體對象. ●abstract 和 static是冤家
9. final ●final類不允許有子類, 方法不能被覆蓋, 類不會再被擴充; ●final方法不允許被子類方法覆蓋; ●final變數表示常量, 只允許被賦值一次.
10.static ●static修飾變數, 靜態變數; ●static修飾方法, 靜態方法; ●static修飾的程式碼塊, 靜態代碼塊, 當java虛擬機器載入類時, 就會執行該代碼塊.
11.static變數 ●java虛擬機器載入類時, 會給靜態變數分配記憶體, 只會分配一次記憶體, 每個靜態變數在記憶體中只有一份 ●對於執行個體變數, 每次建立一個執行個體, 就會分配一次記憶體, 執行個體變數可以在記憶體中有多個備份, 互不影響.
12.static方法 ●由於靜態方法能夠不通過它所屬的類的執行個體直接調用, 因此, 靜態方法不能使用當前對象的引用的關鍵字this, 不能直接存取所屬類的執行個體變數和執行個體方法, 只能直接存取所屬類的靜態變數和靜態方法. ●執行個體方法能夠訪問執行個體方法, 執行個體變數, 靜態方法,靜態變數.
13.static代碼塊:類中可以包含靜態代碼塊, 它不會存在於任何方法體中, java虛擬機器在載入類的時候按照他們在類中出現的順序依次執行它們.
14.java允許在一個構造方法中,用this調用另一個構造方法, 但必須遵循以下規則: ●this語句必須作為構造方法的第一條語句; ●只能通過this來調用其他的建構函式.
15.預設構造方法: 沒有參數的構造方法. 如果一個類顯示的定義了一個或者多個建構函式, 帶參, 那麼這個類就失去了預設的構造方法.
16.子類建構函式調用父類建構函式: ●只能通過super來進行調用 ●調用語句必須放在構造方法中的第一條語句.
17.finalize():程式不能完全依賴對象的finalize()方法來完成收尾工作,而應該在哪學確信能執行的方法中完成收尾工作. 通過編程影響記憶體回收雖然程式員無法控制JVM的記憶體回收機制。但是可以通過編程的手段來影響,影響的方法是,讓對象符合記憶體回收條件。分別說來有一下幾種:●將無用對象賦值為null。●重新為引用變數賦值。比如:Person p = new Person("aaa");p = new Person("bbb");這樣,new Person("aaa")這個對象就是垃圾了----符合記憶體回收條件了。●讓相互聯絡的對象稱為“島”對象Person p1 = new Person("aaa");Person p2 = new Person("bbb");Person p3 = new Person("ccc");p1=p2; p2=p3; p3=p1;p1=null; p2=null; p3=null;在沒有對p1、p2、p3置null之前,它們之間是一種三角戀關係。分別置null,三角戀關係依然存在,但是三個變數不在使用它們了。三個Person對象就組成了一個孤島,最後死在堆上----被記憶體回收掉。●強制的記憶體回收System.gc(), Runtime.gc()實際上這裡的強制,是程式員的意願、建議,什麼時候執行是JVM的記憶體回收行程說了算。調用記憶體回收也不一定能保證未使用的對象一定能從記憶體中刪除。唯一能保證的是,當你記憶體在極少的情況,記憶體回收行程在程式拋出OutofMemaryException之前運行一次。
18.java參數傳遞的方式: http://hi.baidu.com/mltong2008/blog/item/b73a434b8ec837f783025c38.html ●傳遞基本類型: 類型的值 ●傳遞引用: 傳遞引用的地址的值, 若在函數中改變了引用的對象就會類似於傳值...在Java中對象作為參數傳遞時,是把對象在記憶體中的地址拷貝了一份傳給了參數.
19.父類預設構造方法的自動調用: 子類的構造方法沒有用super()語句顯示調用父類的構造方法, 用這樣的方法建立子類對象時, java虛擬機器會自動先調用父類的預設構造方法. 如果父類沒有提供預設的構造方法時, 會出現編譯錯誤.
20.this,super關鍵字作用:覆蓋java語言的預設範圍,使被屏蔽的方法和變數成為可見. ●場合一: 方法中局部變數和類的成員變數同名 ●場合二: 子類某個方法覆蓋了父類的方法 場合三: 子類定義了父類同名的成員變數.
21.內部類總結: http://www.cnblogs.com/jerrychoi/archive/2010/03/12/1684394.html.
22.成員變數在編譯時間解析; 成員函數在運行時解析.