首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口是对象的实例,对象是Java中接口的实例?

接口是对象的实例,对象是Java中接口的实例?
EN

Stack Overflow用户
提问于 2019-01-13 18:49:03
回答 3查看 67关注 0票数 1

我定义了一个名为IntF的接口

我还定义了一个名为Cls的类,它实现了IntF

下面是一些客户端代码:

代码语言:javascript
复制
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很满意,但这些东西有点模糊。

任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-13 18:50:46

ic都保存对Cls类实例的引用。因此两者都是instanceof Cls。由于Cls类实现了IntF接口,所以两者都是instanceof IntF

票数 4
EN

Stack Overflow用户

发布于 2019-01-13 18:59:19

关键字instanceof在这里是误导的。a instanceof B的意思是:

变量a引用的对象提供类或接口B中定义的所有方法,因为a (其类)引用的对象类型是类或接口B通过任何方式继承的后代。

因此,我只能访问在IntF接口中定义的方法,而c则可以访问定义的方法?使用实例可以告诉B是否有权访问A类或接口A中定义的所有方法?-安吉尔·加西亚

这与其说是“有机会”的问题,不如说是“有机会”的问题。回答的问题

a instenceof B是:我可以将对象存储在a中的B类型变量中(然后访问方法仅在B中可用)。

代码语言:javascript
复制
if(i instanceof Cls)
   Cls i2= (Cls)i;   

不要在理解instanceof方面投入太多的精力。你永远不应该需要它在现实生活中,因为它是一个工具,有效地防止你使用最宝贵的好处,OOP:多形性。

票数 2
EN

Stack Overflow用户

发布于 2019-01-13 22:10:57

Object.getClass

另外两个关于instanceof的答案是正确的。它可能澄清您的想法,知道您也可以获得实例的实际具体类。

Java中的每个类都是从Object类扩展的。Object包括一个getClass方法。该方法返回一个Class类型的对象--但不要过多地考虑这个问题,否则会使您的头部受伤。这里的真正要点是,您可以请求特定实例后面的具体类的文本名称。

代码语言:javascript
复制
String className = someInstance.getClass().getName() ;

下面是一个接口Animal的示例,以及实现该接口的3个类:CatDogChihuahuaChihuahua类将Dog扩展为yip,而不是树皮。我们实例化了所有3个具体的类,但将每个实例保存为更通用的Animal接口。注意,我们可以获得实例的最特定的子类,例如DogChihuahua

代码语言:javascript
复制
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很满意,但这些东西有点模糊。

别担心,让它变得模糊。实践带来了清晰的。抽象思维(双关意)使概念难以理解。

一旦您在代码库的某个部分想发送一条消息,但不关心它是通过电子邮件或短消息发出的,那么您将看到使用具体类EmailMessage & SmsMessageMessage接口是明智的。组成消息的代码部分只需要接口方法,而代码中实际发送消息的部分则需要具体的类。

当您处理邮件订单履行,并获得您的第一个具有特殊需要的国际邮件,如海关申报,然后您将看到需要一个MailOrder接口与具体的类为DomesticMailOrder & InternationalMailOrder。您的应用程序列表命令管理器查看的部分只需要接口上的方法,例如getDollarValue,而负责发送的应用程序部分则需要具体类提供的不同行为。

https://en.wikipedia.org/wiki/Abstract_and_concretehttps://en.wikipedia.org/wiki/Class_(computer_programming)#Abstract_and_concrete)也请参阅维基百科。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54172066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档