我定义了一个名为IntF的接口
我还定义了一个名为Cls的类,它实现了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很满意,但这些东西有点模糊。
任何帮助都是非常感谢的。
发布于 2019-01-13 18:50:46
i和c都保存对Cls类实例的引用。因此两者都是instanceof Cls。由于Cls类实现了IntF接口,所以两者都是instanceof IntF。
发布于 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中可用)。
if(i instanceof Cls)
Cls i2= (Cls)i; 但
不要在理解instanceof方面投入太多的精力。你永远不应该需要它在现实生活中,因为它是一个工具,有效地防止你使用最宝贵的好处,OOP:多形性。
发布于 2019-01-13 22:10:57
Object.getClass
另外两个关于instanceof的答案是正确的。它可能澄清您的想法,知道您也可以获得实例的实际具体类。
Java中的每个类都是从Object类扩展的。Object包括一个getClass方法。该方法返回一个Class类型的对象--但不要过多地考虑这个问题,否则会使您的头部受伤。这里的真正要点是,您可以请求特定实例后面的具体类的文本名称。
String className = someInstance.getClass().getName() ;下面是一个接口Animal的示例,以及实现该接口的3个类:Cat、Dog、Chihuahua。Chihuahua类将Dog扩展为yip,而不是树皮。我们实例化了所有3个具体的类,但将每个实例保存为更通用的Animal接口。注意,我们可以获得实例的最特定的子类,例如Dog和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很满意,但这些东西有点模糊。
别担心,让它变得模糊。实践带来了清晰的。抽象思维(双关意)使概念难以理解。
一旦您在代码库的某个部分想发送一条消息,但不关心它是通过电子邮件或短消息发出的,那么您将看到使用具体类EmailMessage & SmsMessage的Message接口是明智的。组成消息的代码部分只需要接口方法,而代码中实际发送消息的部分则需要具体的类。
当您处理邮件订单履行,并获得您的第一个具有特殊需要的国际邮件,如海关申报,然后您将看到需要一个MailOrder接口与具体的类为DomesticMailOrder & InternationalMailOrder。您的应用程序列表命令管理器查看的部分只需要接口上的方法,例如getDollarValue,而负责发送的应用程序部分则需要具体类提供的不同行为。
https://en.wikipedia.org/wiki/Abstract_and_concrete和https://en.wikipedia.org/wiki/Class_(computer_programming)#Abstract_and_concrete)也请参阅维基百科。
https://stackoverflow.com/questions/54172066
复制相似问题