为了账号安全,请及时绑定邮箱和手机立即绑定

下面的内容不明白,Animal不是接口吗,为什么可以定义方法?

下面的内容不明白,Animal不是接口吗,为什么可以定义方法?

UYOU 2022-05-19 12:15:10
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()//这里不明白,Animal不是接口么,怎么可以定义方法?{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();}}interface Animal{void eat();void sleep();}
查看完整描述

4 回答

?
呼如林

TA贡献1798条经验 获得超3个赞


package baidu; 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()// 这里不明白,Animal不是接口么,怎么可以定义方法?    {        return new Animal()// 还有这里,接口不是不能实例化么?? 你说的没有错,确实不能实例化,但是这里是匿名类,效果相当于代码2        {            public void eat() {                System.out.println("animal eat");            }             public void sleep() {                System.out.println("animal sleep");            }        };    }    //代码2    Animal getAnimal2(){        class AnimalTest implements Animal{             @Override            public void eat() {                // TODO Auto-generated method stub                             }             @Override            public void sleep() {                // TODO Auto-generated method stub                             }        }        return new AnimalTest();    }} class Test {    public static void main(String[] args) {        Zoo z = new Zoo();        Animal an = z.getAnimal();        an.eat();        an.sleep();    }} interface Animal {    void eat();     void sleep();}



查看完整回答
反对 回复 2022-05-23
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

返回的不是Animal,其实是Animal的匿名子类,因为已经把Animal借口中的抽闲函数具体化了。


Interface A{  void show();}class Test{    pubic static void main(String[] args)    {        Interface a=null;        //a=new Interface(); 这句是错误的,接口不能实例化        a=new Interface(){           pulibc static void show()           {             System.out.println("我其实是接口的实现子类,不是接口");           }        };        a.show();//正确    }}



查看完整回答
反对 回复 2022-05-23
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

Animal getAnimal(),接口可以作为返回类型,指定返回的类型必须是实现当前接口的类.

new Animal(){

    void eat() {

    }

    void sleep() {

    }

}

这是一个匿名类,只是这个类没有类名,但它实现了Animal接口,

如果换个写法你可能就明白了:


...Animal getAnimal() {    return new A();}...class implements Animal {    public void eat(){    System.out.println("animal eat");    }                   public void sleep(){    System.out.println("animal sleep");    }}



查看完整回答
反对 回复 2022-05-23
?
守着一只汪

TA贡献1872条经验 获得超3个赞

Animal getAnimal()//这里不明白,Animal不是接口么,怎么可以定义方法?
接口不能直接实例化,但是可以做方法的返回类型

return new Animal()//还有这里,接口不是不能实例化么??
{
。。。。}
这里相当于一个匿名内部类,为Animal的一个子类,所以可以实例化

查看完整回答
反对 回复 2022-05-23
  • 4 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信