日期:2014-05-20  浏览次数:20814 次

问一个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();