在实现无关接口Java的对象上进行转换

时间:2013-08-25 09:11:01

标签: java

    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 Interface

Ursus扩展Mammalia实现Omnivora界面

Felidae延伸了Mammalia

可以看出omnivora和eat是不相关的界面,但是Line 1和Line 2分别打印出“吃的实例”和“杂食性的实例”。

有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:4)

  

可以看出omnivora和eat是不相关的界面,但是Line 1和Line 2分别打印出“吃的实例”和“杂食性的实例”。

     

有人可以告诉我为什么吗?

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

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

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

答案 1 :(得分:1)

Mammalia实现了eatomnivora,这意味着Mammalia的任何子类都是这两个接口的子类型。因此,任何ursus对象都是eatomnivora

答案 2 :(得分:1)

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

无论你投了多少,动态类型i都是ursus,它是eatomnivora的子类。结果与您获得的结果不同。

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