[英]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.