2017-09-03 64 views
1

我想了解後期綁定。和搜索結果: 延遲綁定:類型是未知的,直到變量在運行期間被執行;通常是通過分配,但還有其他方式來強制類型;動態類型語言將這稱爲底層特性,但許多靜態類型語言有一些實現後期綁定的方法。Java:後期綁定和我在哪裏使用它?什麼是好處?

和例子是這樣的:

public class DynamicBindingTest { 

    public static void main(String args[]) { 
     Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car 
     vehicle.start();  //Car's start called because start() is overridden method 
    } 
} 

class Vehicle { 

    public void start() { 
     System.out.println("Inside start method of Vehicle"); 
    } 
} 

class Car extends Vehicle { 

    @Override 
    public void start() { 
     System.out.println("Inside start method of Car"); 
    } 
} 

但是,什麼是受益汽車車輛=新車();使用這個。應該只寫 汽車=新車(); ?請向我解釋一下?

+0

泛型開發,依賴注入,總的來說它實際上取決於案例。 C.f. – Transcendent

+0

C.f. [「對接口編程意味着什麼?」](https://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface) – markspace

+0

@markspace它有一個很好的答案。 –

回答

3

但有什麼好處車輛=新車();使用這個。應該只寫汽車車=新車(); ?請向我解釋一下?

是的,你可以做到這一點。在這個小例子中,後期綁定幾乎沒有直接的好處。

但是,這個略有不同的例子呢?

public static void main(String args[]) { 
    Vehicle vehicle = (args[0].equals("car")) ? new Car() : new Vehicle(); 
    vehicle.start(); 
} 

...或者,如果我們加Vehicle更多的子類,和(比如說)實例化一個CarTruck ...


還有其他的好處也將變得更加清楚你在編程方面積累經驗,尤其是因爲你必須編寫並保持更大的程序。


爲了記錄,Java通常被歸類爲靜態類型語言。在你的例子和我的例子中,多態/後期綁定都依賴於靜態類型。如果我們使用類型轉換,instanceof和類似的動態類型只會發揮作用。

當發生類型檢查時,靜態和動態類型之間的區別大約是。如果類型檢查在編譯時發生(主要是),並且在編譯時報告錯誤,則語言會靜態檢查。


我們還可以添加更多的子類Vehicle,並修改main方法來創建和啓動任何樣的車,就不能不提子類的名稱在源代碼main。這是後期綁定的另一個方面,在您的示例中並不明顯。

0

要調用的方法是在運行時根據對象的運行時類型在每種情況下決定的。在編譯時做出的唯一決定是調用final,private或static方法,或者在一組重載方法中進行選擇(如果重載方法不是最終的,私有的或靜態的,這仍然會導致運行時選擇。)

而第二個問題的答案是: 爲什麼?

vehicle car= new Car(); 

,而不是

Car car= new Car(); 

這是多態及的情況認爲,當你必須使用一個for循環與汽車和bike.They都是車輛因此在這裏我們將車輛陣列和可以存儲這兩個對象,我們不必使用不同的自行車和汽車循環。

相關問題