4
    class inher1
    {

    public static void main(String...args)
    {

     eat i = new ursus();


      if(i instanceof eat) System.out.println("Instance of eat");

 //Line 1
 if((omnivora)i instanceof eat) System.out.println("Instance of eat"); 
 //Line 2
if((omnivora)i instanceof omnivora) System.out.println("Instance of omnivora"); 

 if(((omnivora)i).like_honey)System.out.println("Like Honey Obtained");

    }

    }

    interface eat //Interface 1
    {
        public void eat();
    }

    interface omnivora //Interface 2
    {
        final public static boolean like_honey = true;
    }
    abstract class mammalia implements eat
    {
      abstract public void makenoise();
      public void eat(){System.out.println("Yummy");}
    }

    class ursus extends mammalia implements omnivora
    {
        public void makenoise(){System.out.println("Growl");}


    }

    class felidae extends mammalia
    {
        public void makenoise(){System.out.println("Roar");}
    }

这是我的层次结构

Eat 和 Omnivora 是不相关的接口

Mammalia 实现 Eat 接口

Ursus 扩展 Mammalia 实现 Omnivora 接口

猫科动物延伸哺乳动物

可以看出,omnivora 和 eat 是不相关的接口,但第 1 行和第 2 行都分别打印了“Instance of eat”和“Instance of omnivora”。

有人能告诉我为什么吗?

4

3 回答 3

4

可以看出,omnivora 和 eat 是不相关的接口,但第 1 行和第 2 行都分别打印了“Instance of eat”和“Instance of omnivora”。

有人能告诉我为什么吗?

因为您正在测试的对象是一个ursus,它实现omnivora并且还实现eat(通过继承自mammalia)。

关于接口的关键之一是一个类可以实现多个不相关的接口,并且它的实例被认为是每个接口的“实例”。

一个具体的例子是FileReader,它扩展Reader但也实现了ReadableCloseableAutoCloseable最后两个本身与阅读无关,但该类的实例是所有这些接口的实例。

于 2013-08-25T09:14:51.830 回答
1

Mammalia实现了eatand omnivora,这意味着 的任何子类Mammalia都是这两个接口的子类型。所以任何ursus对象都是 aneat和 an omnivora

于 2013-08-25T09:15:11.573 回答
1

运算符instanceof不检查static对象的类型,而是检查其dynamic类型。 (omnivora)i instanceof eat与 完全相同i instanceof eat

不管你施放多少,它的动态类型iursus,它是 and 的子eatomnivora。结果不能与您获得的不同。

请尊重 Java 的命名约定。您的程序非常难以阅读。

于 2013-08-25T09:15:17.413 回答