[英]type of object while implementing interface
以下是我的代碼......
它沒那么復雜。
在這里,我想要理解,在類D中,b是一個接口類型變量,在該變量中,我們存儲對實現該接口(B)的類(C)的新對象的引用。 我們如何能夠將類型C的對象分配給接口B類型變量b ..? 類和接口都有不同的類型,然后當我們在類上實現接口時它是特殊的,我們能夠做到這是我的問題
public interface A {
}
public interface B {
public A methodABCD();
}
public class C implements B {
final A typeA;
public A methodABCD() {
return typeA;
}
}
public class D {
static private B b;
static public A methodABCD() {
if (b == null) {
b = new C();-------------->How..?
}
return b.methodABCD();
}
}
好的,我們舉個例子來說明一下。
interface Animal {
public void eat();
}
class Human implements Animal{
public void eat(){
// Eat cakes and Buns
}
}
class Dog implements Animal{
public void eat(){
// Eat bones
}
}
現在讓我們看看如何使用它們
Animal h = new Human();
Animal d = new Dog();
現在在某些時候你可能想要改變你的人類以像狗一樣行事。
h =d;
h.eat();// Eat bones
你的想法成為可能,因為它們屬於同一類型。 想象一下,沒有Animal界面,看看將人類轉變為狗是多么困難。
您可以看到類型變化的靈活性和優勢。 你被允許這樣做,因為他們都是動物,只有一個界面。
這是有效的
B b = new C();
只是因為C實現了接口B ,所以你告訴編譯器:
“我需要一個可以做某事而不是那個東西的對象B ......”,這種方法被稱為接口編程,並允許你后來改變類F的類C ,只要F 也可以做一些事情 ,那個是一個更靈活的設計......
Java隱藏了在Heap中創建的對象的內存地址。 對象由引用訪問。 一個對象可能有多個引用 。 使用=
運算符引用來引用對象並使用.
運算符引用可以調用對象的特定行為。 引用和對象存儲在不同的存儲位置。
如果存在類C
X
,那么根據Java語言規范, X
可以具有類型為C
引用或更高層次結構中的任何超類或由C
實現的任何接口或更高層次結構中的任何超類或任何接口通過任何這些接口擴展。
class A implements IA{}
class B extends A implements IB{}
interface IC extends IA{}
interface IB extends ID{}
class E{}
class F extends B{}
現在new B()
可以具有類型A
, B
, IA
, IB
, ID
引用,但是不能引用類型E
, IC
, F
因為它們不屬於更高的杠桿層級。
您可以在java中使用interface作為引用類型。 它只能引用那些實現該接口的類的對象。 但請記住,使用interface作為引用,您只能訪問在該接口中聲明的那些方法。 您的類可以定義其他方法,但使用接口引用無法訪問。
在某種程度上,當你說類和接口是不同類型時,你是對的,但是當一個類實現一個接口時,它為該接口中聲明的所有方法提供定義,因此該接口可以引用實現類對象。
它有點像繼承。
當一個類實現一個接口時,它在一個契約下綁定,為所有方法提供實現。 因此,當接口引用類對象時,您可以非常確定該類必須已實現該接口,因此所有方法聲明現在都具有可以調用的定義。
這是因為其中一個設計原則,Liskov Substituion Principles,L out of SOLID,如果B是P的子類型,則P類型的對象可以用類型B的實例替換。在谷歌上搜索SOLID設計原則以獲取更多詳細信息。 面向對象的語言遵循這一點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.