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分别打印出“吃的实例”和“杂食性的实例”。
有人可以告诉我为什么吗?
答案 0 :(得分:4)
可以看出omnivora和eat是不相关的界面,但是Line 1和Line 2分别打印出“吃的实例”和“杂食性的实例”。
有人可以告诉我为什么吗?
因为您正在测试的对象是ursus
,它实现了omnivora
并且还实现了eat
(通过继承自mammalia
)。
接口的关键之一是类可以实现多个不相关的接口,并且其实例被视为每个接口的“实例”。
一个具体的例子是FileReader
,它扩展了Reader
,但也实现了Readable
,Closeable
和AutoCloseable
。最后两个本身与阅读无关,但该类的实例是所有这些接口的实例。
答案 1 :(得分:1)
Mammalia
实现了eat
和omnivora
,这意味着Mammalia
的任何子类都是这两个接口的子类型。因此,任何ursus
对象都是eat
和omnivora
。
答案 2 :(得分:1)
运算符instanceof
不会检查对象的static
类型,而是检查其dynamic
类型。 (omnivora)i instanceof eat
与i instanceof eat
完全相同。
无论你投了多少,动态类型i
都是ursus
,它是eat
和omnivora
的子类。结果与您获得的结果不同。
请尊重Java的命名约定。你的程序非常难以阅读。