多型的機制問題,參考這篇博文,講的通俗易懂,大概為下:
在建立子物件時,呼叫子類構造器前會呼叫父類構造器——即建立乙個子物件,這個子物件中隱含著乙個父物件。
多型引用的指標指向的是子物件中的這個父物件,而父物件中的方法指標指向方法區的哪個方法,是根據建立的子物件的型別決定的,當你建立這個子物件時,該子物件中的隱含父物件中的方法指標指向的是方法區中的子物件的方法位址,名字仍是父物件中的方法名,因此使用多型能夠呼叫父類物件中宣告的方法,但實際的**確是子類重寫後的**。
域訪問操作不是多型的,當物件使用多型向上轉型時,訪問的域將是父類的域,而非理想中的通過多型引用子類的域。如對於下面**:
class sup
class sub extend sup
}
介面可以是public的或包訪問的,其域隱式的定義為static和final的
類中可以定義私有介面,但一般只用來內部類實現,這種私有介面只有該類有使用許可權;介面中無法定義私有介面。
內部類擁有其外部類所有成員的訪問權,是因為外部類物件在建立了乙個內部類物件時,此內部類物件必定會秘密地捕獲乙個指向外部類物件的引用,在訪問此外部類的成員時,就是用那個引用來選擇外部類成員。因此要建立內部類物件,必須在這之前建立好外部類物件並用其建立。
匿名內部類中訪問外部區域性變數時,該變數必須是final的(jdk1.8將其設定為預設,隱式final),內部類物件試圖訪問外部方法中的區域性變數時,該變數很可能已經不存在了,若拷貝到內部類中會帶來不一致性,從而需要使用final宣告保證一致性。說白了,內部類會自動拷貝外部變數的引用,為了避免:1. 外部方法修改引用,而導致內部類得到的引用值不一致 2.內部類修改引用,而導致外部方法的引數值在修改前和修改後不一致。於是就用 final 來讓該引用不可改變。
使用介面例項化並用匿名內部類的方式實現,從而使匿名內部類實現介面。
普通的內部類不能建立static資料,巢狀類(靜態內部類)可以。巢狀類物件的建立不需要外部物件,同時巢狀類物件不能訪問非靜態外部類物件。
雖然介面中不能放置任何**,但可以在介面內部定義內部類,並實現該介面,可以被介面的所有不同實現類共有。
為什麼要用內部類?
內部類的的覆蓋並沒有什麼卵用。
區域性內部類定義在**塊中,一般定義在方法體中,使用區域性內部類而不使用匿名內部的原因是需要乙個已命名的構造器方便過載或需要多個物件,而匿名內部類只能初始化。
每個類都會生成乙個.class檔案,內部類的檔名為外部類名稱$內部類名稱.class
介面,多型,內部類筆記
介面型別的應用 用於介面指向型別的子類物件 packagecom.sdut.day2 inte ceusb public classbookpc public static voiduseusb usb u classupanimplementsusb public voidclose classm...
繼承,多型,介面,內部類
package extend public class people public void setage int age public people public people int age public void show fianl關鍵字的作用 fianl修飾類 該類不能被繼承 不能有子類,...
多型和內部類
多型是繼封裝 繼承之後,物件導向的第三大特性。定義 指同一行為具有多個不同的表現形式 前提 繼承或者實現 二選一 2.方法的重寫 意義體現 不重寫,無意義 3.父類引用指向子類物件 格式體現 父類型別 變數名 new 子類物件 變數名.方法名 fu fu newzi animal a newcat ...