问题描述
abstractclassAnimalVoice{abstractStringName();abstractStringVoice();}publicclassAnonymous{publicvoidtest(AnimalVoicea){System.out.println("那里有只"+a.Name()+"在"+"""+a.Voice()+"""+"的叫着。");}publicstaticvoidmain(String[]args){Anonymousas=newAnonymous();//传入匿名内部类的实例as.test(newAnimalVoice(){@OverridepublicStringVoice(){return"汪汪汪...";}@OverridepublicStringName(){return"小狗";}});AnimalVoicea1=newAnimalVoice(){@OverridepublicStringVoice(){return"喵喵喵...";}@OverridepublicStringName(){return"小猫";}};as.test(a1);}}这个抽象类为什么能创建实例啊??
解决方案
解决方案二:
AnimalVoicea1=newAnimalVoice(){@OverridepublicStringVoice(){return"喵喵喵...";}@OverridepublicStringName(){return"小猫";}};匿名内部类就是这样创建实例的,它实现了抽象类的全部方法,其实就相当于一个具体的类了,只不过他没有名字。
解决方案三:
其实你创建匿名内部内的时候效果相当于创建了一个该抽象类的子类,然后由该子类创建一个对象,只是这个子类对象没有名字而已,这是一种多态的体现
解决方案四:
你把传入的匿名内部类那个参数拆分成两部分来理解,第一步:定义了一个没有名字的类,正常情况下类是有名字的,这里没有名字,而是继承了抽象类,同时重写了其中的方法。第二步:创建刚刚定义的没有名字的类的实例对象,作为参数传入。语法就是把这两步结合到一起了。
解决方案五:
你已经都实现抽象类的方法了,相当于覆盖了原来的方法。你原来代码:AnimalVoicea1=newAnimalVoice(){@OverridepublicStringVoice(){return"喵喵喵...";}@OverridepublicStringName(){return"小猫";}};as.test(a1);}}
你改成这个就不能运行了。。。AnimalVoicea1=newAnimalVoice();
解决方案六:
为什么会创建实例?因为此处的是相当与对抽象类的继承的类的实现,只不过此处的类没有名字而已。