簡體   English   中英

接口是對象的實例,而對象是Java中接口的實例嗎?

[英]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很滿意,但是這個東西有點模糊。

任何幫助表示贊賞。

ic持有對Cls類實例的引用。 因此,兩者都是instanceof Clsinstanceof 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個類CatDogChihuahua 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." ) ;
    }
}

看到此代碼在IdeOne.com上實時運行。

喵。

吠。

是的

奇瓦瓦州


我以為我將是IntF的實例,但這沒有任何意義,因為您無法真正初始化接口,對嗎? 可以嗎

不可以,您不能在Java中實例化接口。

但是多態 (“許多形狀”)的要點是,您可以使用5種方法實例化一個類的對象,而使用3種方法將對象的引用視為僅是接口的引用。 通過該引用在對象上調用方法時,只能調用3個方法。 編譯器不允許您調用該類中5個方法中的另外2個,因為從接口的角度來看,這兩個方法不存在。 我想到了這一點(將對對象的引用作為接口),就像通過濾色鏡查看一樣,遮擋了某些波長,同時允許其他波長通過。

我對Java很滿意,但是這個東西有點模糊。

別擔心,讓它變得模糊。 實踐帶來清晰 抽象地考慮它(雙關語意)使這些概念難以掌握。

一旦您進入了代碼庫的某個部分,希望在其中發送消息,而不管消息是否通過電子郵件或SMS發送出去,那么您將發現擁有一個包含具體類EmailMessageSmsMessageMessage接口的智慧。 組成消息的代碼部分僅需要接口方法,而實際上按其方式發送消息的代碼部分將需要具體的類。

當您處理郵件訂單履行時,並收到第一份有特殊需要的國際郵件(如海關申報單)時,您將看到需要MailOrder接口以及具體的DomesticMailOrderInternationalMailOrder類的接口。 您的應用程序列出訂單供管理者查看的部分僅需要界面上的方法(例如getDollarValue而負責運輸的應用程序部分則需要具體類提供的不同行為。

另請參見Wikipedia,以了解抽象,具體類(計算機編程)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM