本人菜鸟一只,有个java的继承问题求助各位大侠:
有一个父类A,一个继承A的子类B
对于B b = new B()
b可以调用父类的方法和子类自己扩展的方法,并且如果子类复写了父类的变量或者方法,那么b调用的结果是复写之后的子类的变量值或者方法。
但是如果A a = new B()
那么a不可以调用B类中扩展的任何子类的方法,且如果A和B有相同名称的变量i,那么a.i返回结果是A中的i的值。
那么请问这样子的写法A a = new B();有什么用呢?结果不就相当于A a = new A()么?
想了很久没明白,求大侠不吝赐教。继承Java
有一个父类A,一个继承A的子类B
对于B b = new B()
b可以调用父类的方法和子类自己扩展的方法,并且如果子类复写了父类的变量或者方法,那么b调用的结果是复写之后的子类的变量值或者方法。
但是如果A a = new B()
那么a不可以调用B类中扩展的任何子类的方法,且如果A和B有相同名称的变量i,那么a.i返回结果是A中的i的值。
那么请问这样子的写法A a = new B();有什么用呢?结果不就相当于A a = new A()么?
想了很久没明白,求大侠不吝赐教。继承Java
中有String s = "b",那么打印a.s结果还是a而不是b这样子A a = new B()和A a = new A()完全没有差别啊感觉。。
所以如果用这种方法传递一个引用,最后实现的时候再new就很快了。
(1)属性不继承,不覆盖。
假设A和B都有相同的属性x,但是请注意这2个x是不一样的,可以理解A有属性ax,B有属性bx;
B b = new B()和A a = new B()构造出来的对象b和a,分别调用属性x时候,b.x其实就是b.bx,a.x就是a.ax(2)方法会覆盖
假设A和B都有相同的方法f(),执行的时候由对象的实际类决定;
B b = new B()和A a = new B()构造出来的对象b和a,分别调用方法f()时候,因为b和a实际上都是new B(),所以效果一样。但是A a = new A()就和他们不一样了,因为这个a是通过new A()出来的类A的对象。