重載:方法名稱相同,但參數不同的多個同名函數
注意:1.參數不同的意思是參數類型、參數個數、參數順序至少有一個不同
2.返回值和異常以及存取修飾符,不能作為重載的條件(因為對於匿名調用,會出現歧義,eg:void a ()和int a() ,如果調用a(),出現歧義)
3.main方法也是可以重載的
覆寫:子類別重寫父類別的方法,要求方法名稱和參數型別完全一樣(參數不能是子類別),回傳值和異常比父類別小或相同(即為父類別的子類別),存取修飾子比父類大或相同
兩同兩小一大
注意:子類別實例方法不能覆寫父類別的靜態方法;子類別的靜態方法也不能覆寫父類別的實例方法(編譯時報錯),總結為方法不能交叉覆寫
隱藏:父類別和子類別擁有相同名字的屬性或方法時,父類別的同名的屬性或方法形式上不見了,實際上是還是存在的
注意:當發生隱藏的時候,宣告類型是什麼類,就呼叫對應類別的屬性或方法,而不會發生動態綁定
方法隱藏只有一種形式,就是父類別和子類別存在相同的靜態方法
屬性只能被隱藏,不能被覆蓋
子類別實例變數/靜態變數可以隱藏父類別的實例/靜態變量,總結為變數可以交叉隱藏
隱藏和覆蓋的區別:
被隱藏的屬性,在子類別被強制轉換成父類別後,存取的是父類別中的屬性
被覆寫的方法,子類別被強制轉換成父類別後,呼叫的還是子類別本身的方法
因為覆蓋是動態綁定,是受RTTI(run time type identification,運行時類型檢查)約束的,隱藏不受RTTI約束,總結為RTTI只針對覆蓋,不針對隱藏
特殊情況:
1.final修飾的屬性可以被隱藏,但是不能被賦值,即不能用=來賦值,網上說final屬性不能被修改,這個說法不準確,因為對於引用類型的變量用final修飾後,它只是不能被指向其他對象,但可以改它自己的值,可以用ArrayList測試,final屬性可以在運行的時候進行初始化,但不能不出現初始化語句
2.final修飾的方法不能被覆蓋,可以被重載
3.final修飾的類別不能被繼承
4.private 方法隱式加入了final