interface Monster{ void menace(); } interface DangerousMonster extends Monster{ public abstract void destroy(); } interface Lethal{ void kill(); } class DragonZilla implements DangerousMonster{ public void menace(){} public void destroy() {} } interface Vampire extends DangerousMonster,Lethal{ void drinkBllod(); } class VeryBadVampire implements Vampire{ public void destroy() { } public void menace() {} public void kill() {} public void drinkBllod() {} } public class InterfaceExtends { static void u(Monster b){ b.menace(); } static void v(DangerousMonster d){ d.menace(); d.destroy(); } static void w(Lethal l){ l.kill(); } public static void main(String[] args){ DangerousMonster barney = new DragonZilla(); u(barney); v(barney); Vampire vlad = new VeryBadVampire(); u(vlad); v(vlad); w(vlad); } }
记得java中的interface不能创建对象。但代码中 new VerBadVampire()将其转型成为interface。而w方法中也是接收一个interface的参数。
解决方案
1
很明显是用接口具体类实现的,w方法接收的接口的子实现,自然能进行调用。
1
看下向上转型吧
6
Vampire vlad = new VeryBadVampire();这个并不是创建接口对象,而是创建子类对象(接口是不能创建对象的),然后赋给父类引用。
当调用viad(接口)中定义的方法时,jvm会调用具体对象(子类)的方法。这就是java的多态。
Vampire vlad = new VeryBadVampire();
u(vlad);
v(vlad);
w(vlad);
这个u,v,w三个方法参数声明为Vampire(接口),这个就是我们常说的面相接口编程。这样做的好处是,可以根据不同的业务,创建不同的接口(Vampire)实现类,而u,v,w这三个方法中的代码则不需要改变。这样就可以在改动很少的情况下扩展业务。
当调用viad(接口)中定义的方法时,jvm会调用具体对象(子类)的方法。这就是java的多态。
Vampire vlad = new VeryBadVampire();
u(vlad);
v(vlad);
w(vlad);
这个u,v,w三个方法参数声明为Vampire(接口),这个就是我们常说的面相接口编程。这样做的好处是,可以根据不同的业务,创建不同的接口(Vampire)实现类,而u,v,w这三个方法中的代码则不需要改变。这样就可以在改动很少的情况下扩展业务。
6
通俗易懂地讲,你就记住,接口不可以直接用于new的对象。但是可以作为参数类型以及类类型出现,new 后边跟着的必须是非接口类,但是new 出来的对象实例可以用接口类类型来接受,同样一个方法的参数类型也可以用接口类型,跟这个道理一样,只是使用接口类型,而不是用接口类去实例化对象,接口类型声明变量,接受的是其实现类new出来的对象,这也是java 实现多态的必要条件:用接口类型或基类类型去声明变量,来接收实现类或子类的对象,当变量调用成员方法时,调用的是其实现类或子类的方法。
6
1、首先只有实际的类才能new,而interface和abstract class都不可以new
2、接口或基类的引用变量可以指向实现类或子类的对象,这是java实现多态性的前提。
什么是多态?也就是用接口或基类声明的引用变量来指向实现类或子类的对象,从而调用该接口的方法时表现的是子类对象的方法。这样就可以达到接口重用的目的。
2、接口或基类的引用变量可以指向实现类或子类的对象,这是java实现多态性的前提。
什么是多态?也就是用接口或基类声明的引用变量来指向实现类或子类的对象,从而调用该接口的方法时表现的是子类对象的方法。这样就可以达到接口重用的目的。