[英]Interfaces are instances of objects and objects are instances of Interfaces in Java?
我有一個定義為IntF
的接口
我還定義了一個名為Cls
的類, IntF
實現IntF
。
這是一些客戶端代碼:
IntF i=new Cls();
Cls c=new Cls();
System.out.print(i instanceof Cls);
System.out.print(c instanceof IntF);
輸出為truetrue
為什么這是輸出? 我認為那將是falsefalse
。
我以為i
將是IntF
的實例,但這沒有任何意義,因為您無法真正初始化接口,對嗎? 可以嗎 我對Java很滿意,但是這個東西有點模糊。
任何幫助表示贊賞。
i
和c
持有對Cls
類實例的引用。 因此,兩者都是instanceof Cls
的instanceof Cls
。 並且由於Cls
類實現了IntF
接口,因此它們都是instanceof IntF
。
關鍵字instanceof
在這里具有誤導性。 a instanceof B
的含義是:
變量
a
引用的對象提供了在類或接口B
定義的所有方法,因為a
(其類)引用的對象的類型是通過任何Java繼承的類或接口B
的后代。
所以我只能訪問IntF接口中定義的方法,而c可以訪問Cls類定義的方法? 使用instanceof可以告訴B是否可以訪問A遵循的任何類或接口中定義的所有方法? –天使加西亞
它不是“具有訪問權限”的問題。 回答的問題
a instenceof B
是:可以在對象存儲a
在類型的變量B
( 然后訪問方法只適用於B
)。
if(i instanceof Cls)
Cls i2= (Cls)i;
但
不要花太多的精力來理解instanceof
。 在現實生活中,您永遠都不需要它,因為它是一種有效地阻止您使用OOP的最有價值的好處: 多態性的工具 。
Object.getClass
關於instanceof
,其他兩個答案是正確的。 知道您還可以獲得實例的實際具體類可能會澄清您的想法。
Java中的每個類都從Object
類擴展而來。 Object
包含一個getClass
方法。 該方法返回Class
類型的對象-但不要考慮太多,否則會傷到頭部。 這里的重點是,您可以隨后在特定實例后面詢問具體類的文本名稱。
String className = someInstance.getClass().getName() ;
下面是一個接口Animal
的示例,以及實現該接口的3個類Cat
, Dog
和Chihuahua
。 Chihuahua
班級將Dog
延伸到yip而不是樹皮。 我們實例化所有3個具體類,但將每個實例都保留為更通用的Animal
接口。 注意,我們可以獲得實例的最具體的子類,例如Dog
vs Chihuahua
。
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Animal animal1 = new Cat() ;
animal1.speak() ;
System.out.println( animal1.getClass().getName() ) ;
Animal animal2 = new Dog() ;
animal2.speak() ;
System.out.println( animal2.getClass().getName() ) ;
Animal animal3 = new Chihuahua() ;
animal3.speak() ;
System.out.println( animal3.getClass().getName() ) ;
}
}
interface Animal {
public void speak() ;
}
class Dog implements Animal {
@Override
public void speak() {
System.out.println( "Bark." ) ;
}
}
class Chihuahua extends Dog {
@Override
public void speak() {
System.out.println( "Yip." ) ;
}
}
class Cat implements Animal {
@Override
public void speak() {
System.out.println( "Meow." ) ;
}
}
喵。
貓
吠。
狗
是的
奇瓦瓦州
我以為我將是IntF的實例,但這沒有任何意義,因為您無法真正初始化接口,對嗎? 可以嗎
不可以,您不能在Java中實例化接口。
但是多態 (“許多形狀”)的要點是,您可以使用5種方法實例化一個類的對象,而使用3種方法將對象的引用視為僅是接口的引用。 通過該引用在對象上調用方法時,只能調用3個方法。 編譯器不允許您調用該類中5個方法中的另外2個,因為從接口的角度來看,這兩個方法不存在。 我想到了這一點(將對對象的引用作為接口),就像通過濾色鏡查看一樣,遮擋了某些波長,同時允許其他波長通過。
我對Java很滿意,但是這個東西有點模糊。
別擔心,讓它變得模糊。 實踐帶來清晰 。 抽象地考慮它(雙關語意)使這些概念難以掌握。
一旦您進入了代碼庫的某個部分,希望在其中發送消息,而不管消息是否通過電子郵件或SMS發送出去,那么您將發現擁有一個包含具體類EmailMessage
和SmsMessage
的Message
接口的智慧。 組成消息的代碼部分僅需要接口方法,而實際上按其方式發送消息的代碼部分將需要具體的類。
當您處理郵件訂單履行時,並收到第一份有特殊需要的國際郵件(如海關申報單)時,您將看到需要MailOrder
接口以及具體的DomesticMailOrder
和InternationalMailOrder
類的接口。 您的應用程序列出訂單供管理者查看的部分僅需要界面上的方法(例如getDollarValue
而負責運輸的應用程序部分則需要具體類提供的不同行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.