繁体   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