在实现无关Java接口的对象上强制转换
这是我的等级制度 Eat和杂食动物是不相关的接口 哺乳动物实现Eat接口 Ursus扩展了哺乳类实现了Omnivora接口 猫科哺乳动物 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 因为您正在测试的对象是一个在实现无关Java接口的对象上强制转换,java,Java,这是我的等级制度 Eat和杂食动物是不相关的接口 哺乳动物实现Eat接口 Ursus扩展了哺乳类实现了Omnivora接口 猫科哺乳动物 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 因为您正在测试的对象是一个ursus,它实现了omnivora,也实现了eat(通过继
ursus
,它实现了omnivora
,也实现了eat
(通过继承哺乳动物
)
关于接口的一个关键问题是,一个类可以实现多个不相关的接口,并且它的实例被认为是每个接口的“实例”
一个具体的例子是,它扩展了
读卡器
,但也实现了可读
、可关闭
和可自动关闭
。最后两个本身与读取无关,但类的实例是所有这些接口的实例。Madaminia
实现了eat
和omnivora
,这意味着Madaminia
的任何子类都是这两个接口的子类型。因此,任何ursus
对象既是eat
对象,也是杂食动物 操作符instanceof
不会检查对象的静态类型,而是检查对象的动态类型<代码>(杂食动物)eat的i实例与eat的i实例完全相同
无论你投了多少,动态类型的i
都是ursus
,它是eat
和杂食动物的子类。结果与你所得到的不会有什么不同
请尊重Java的命名约定。您的程序极难阅读。请记住,接口名和类名应以大写开头;不是小写。两个接口的间接实现,因为“Ursus扩展了哺乳动物实现了杂食接口”(哺乳动物实现了eat)
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");}
}