原文鏈接http://zhhll.icu/2020/05/06/java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/java%E5%9F%BA%E7%A1%80%E4%B9%8B%E7%BB%84%E5%90%88%E4%B8%8E%E7%BB%A7%E6%89%BF/
為了避免重復代碼太多,導致代碼不好維護,大家需要學會如何復用代碼,代碼復用的兩種方式,組合和繼承
組合:在新類中創建現有類的物件
繼承:創建現有類的新類
向上轉型
class Instrument {
public void play() {
System.out.println("Instrument.play()");
}
}
public class Wind extends Instrument {
public void play() {
System.out.println("Wind.play()");
}
}
public class Music {
public static void tune(Instrument i){
i.play();
}
public static void main(String[] args) {
Wind flute = new Wind();
Music.tune(flute); // 向上轉型
}
}
從一個更具體的型別轉化為更一般的型別,所以向上轉型用掛失安全的,子類可能會比父類包含更多的方法,必須至少具有和父類一樣的方法,
final
final方法
final方法的作用是防止子類通過重寫改變方法的行為
類中所有的private方法都是隱式的指定為final,因為不能訪問private方法,所以不能重寫它,給private方法加上final修飾并不會給方法帶來額外的含義,重寫一個private方法時編譯并不會報錯,一個方法是private的,他就不屬于父類的一部分,只是創建了一個同名的方法而已
final類
final類的作用是該類不允許被繼承
多型
方法系結
對于上述向上轉型的例子,編譯器如何知道該呼叫哪個方法,方法的入參只是一個Instrument參考
java采用后期系結,在運行時根據物件的型別進行系結,在運行時判斷物件的型別,從而呼叫方法,在編譯時編譯器不知道物件的型別,java對于static和final方法無法采用后期系結(private方法也是隱式的final)
多型的陷阱
注:多型只是針對于普通方法,對于屬性和靜態方法不會存在多型
屬性在編譯時就會被決議
public class Parent {
public int field = 0;
public int getField(){
return field;
}
}
public class Child extends Parent {
public int field = 1;
@Override
public int getField(){
return field;
}
}
public class TestField {
public static void main(String[] args) {
Parent parent = new Child();
System.out.println("parent.field= "+parent.field);
System.out.println("parent.getField= "+parent.getField());
Child child = new Child();
System.out.println("child.field= "+child.field);
System.out.println("child.getField= "+child.getField());
}
}
執行結果
parent.field= 0
parent.getField= 1
child.field= 1
child.getField= 1
Parent.field和Child,field被分配了不同的存盤空間,Child其實是存在兩個filed屬性的:本身的以及父類的,但是在參考Child的field的時候,默認的field屬性是來自于本身的,如果要獲取父類的該屬性,需要使用super.field來顯示地指定獲取父類屬性
但是這種情況一般不會發生,首先屬性一般來說都是私有private的,其次子類和父類一般也不會起相同的屬性名字
對于靜態方法的話,靜態方法只與類關聯,與物件無關
由于本身的博客百度沒有收錄,博客地址http://zhhll.icu
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245520.html
標籤:Java
上一篇:7 Ajax
下一篇:PHP設計模式之單例模式
