问一个java 接口和内部类的问题 真的有点搞不清
interface Animal
{
void eat();
void sleep();
}
class Zoo
{
private class Tiger implements Animal
{
public void eat()
{
System.out.println("tiger eat");
}
public void sleep()
{
System.out.println("tiger sleep");
}
}
Animal getAnimal()
{
return new Animal()
{
public void eat()
{
System.out.println("animal eat");
}
public void sleep()
{
System.out.println("animal sleep");
}
};
}
}
class Test
{
public static void main(String[] args)
{
Zoo z=new Zoo();
Animal an=z.getAnimal();
an.eat();
an.sleep();
}
}
这段代码可以运行 结果是animal eat和animal sleep 我有疑问 接口类不是不可以实例化吗?
为什么它这里可以用return new Animal然后再用一个匿名内部类会没有问题
还有一段代码 如下
interface Animal
{
void eat();
void sleep();
}
class Zoo
{
class Tiger implements Animal
{
}
Animal getAnimal()
{
return new Tiger()
{
public void eat()
{
System.out.println("tiger eat");
}
public void sleep()
{
System.out.println("tiger sleep");
}
};
}
}
class Test
{
public static void main(String[] args)
{
Zoo z=new Zoo();
Animal an=z.getAnimal();
an.eat();
an.sleep();
}
}
这段代码编译出错 说在第九行Zoo.Tiger is not abstract and does not override abstract method sleep()
in Animal 不知道这里为什么不行 应该怎么改 谢谢!
------解决方案--------------------
1.
return new Animal() {
public void eat() {
System.out.println("animal eat");
}
public void sleep() {
System.out.println("animal sleep");
}
};
这个不是返回Animal的实例,而是实现这个接口的类的实例,
public class AnimalImpl{
public void eat() {
System.out.println("animal eat");
}
public void sleep() {
System.out.println("animal sleep");
}
}
这么理解,然后return new AnimalImpl();