黑马程序员技术交流社区

标题: 为什么子类的向上转型可以转型成接口? [打印本页]

作者: ruibocool    时间: 2015-5-12 09:39
标题: 为什么子类的向上转型可以转型成接口?
interface A{}
A a=new A(){};
这相当于a是接口A的对象了
作者: 396460221    时间: 2015-5-12 10:06
A a=new A();这个才是接口A的对象,但这样是不能成功的。A a=new A(){};这个相当于是接口A 的子类,但大括号内要重写接口的方法。
作者: ruibocool    时间: 2015-5-12 10:33
396460221 发表于 2015-5-12 10:06
A a=new A();这个才是接口A的对象,但这样是不能成功的。A a=new A(){};这个相当于是接口A 的子类,但大 ...

class A{}
class B extends A{}
A b=new B();
这样,b是A的对象,还是B的对象啊?
如果b是A的对象,那么像上例,如果把A改为接口,那不还是接口A的对象吗
作者: 王先荣    时间: 2015-5-12 10:54
本帖最后由 王先荣 于 2015-5-12 10:56 编辑

这里涉及到两个概念 一个是匿名内部类 一个是多态 。如果是interface A{}  A a=new A();这就是你的观点 但后面有个大括号,就是相当与有个类实现了这个接口A new完了 生成了一个子类 对象 然后赋值给接口 这步就是多态的概念了
作者: iamnoten    时间: 2015-5-12 10:55
说b实现了A接口更准确
作者: 348532020    时间: 2015-5-12 11:04
class A{}
class B extends A{}
A a=new B();
这样,a是A的对象 .但是他调方法的时候是编译的时候看做边,执行看右边。比如 调用A中的一个show方法,a.show();编译的时候看左边,只要A类中有这个方法就不会报错,然后执行的时候是看右边的,也就是执行的是B类中重写的那个方法。
如果把A改为接口,那就是是接口A的对象。但是接口都是抽象类,所以不能实例化,A a = new B(); 也是多态,让B 实现A接口,这样B类中一定会重写接口中的方法,然后用A对象调方法,其实执行的是b类中重写的方法。这就是多态的特点。父类或者父接口不能实例化的时候都是用A a = new B();的方法。实际的是调用的子类中重写的方法,但是对象是父类的对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2