本人菜鸟一只,有个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

解决方案 »

  1.   

    好吧,我也是刚学的,貌似还能说两句,对于B b = new B()是new 的子类,给子类创建对象b可以调用子类的方法和变量,也可以调用子类自己新增的方法,而A a = new B()是用父类创建的对象,简而言之就是对象的上转型,对象a可以调用子类继承父类的方法和变量,但像你说的扩展方法应该是子类新增的方法吧,这在对象的上转型中是不可以调用的,即规定对象上型不能调用子类新增的方法,如果要调用,需要强制转换的,说的不好,多多理解,,,
      

  2.   

    谢谢楼上的解释,但是A a = new B()中的a对象即便是调用子类继承父类的方法和变量,得到的结果还是父类中的变量的值,以及父类方法的内容,比如A中有个变量String s = "a",B
    中有String s = "b",那么打印a.s结果还是a而不是b这样子A a = new B()和A a = new A()完全没有差别啊感觉。。
      

  3.   

    呵呵,不是这样,实际上A a = new B();可以分开看,声明一个A 类型的a对象,a并不知道在运行时会执行谁。另外,只是如果不把String s = "a";修饰变为protected,子类不能继承的,子类对于s的赋值当然,没有覆盖掉父类的s。
      

  4.   

    其实这只是一个简单的例子 如果A还有其他的子类也有跟A一样的方法呢?难道每调用一次就new一次,那岂不是很累。
    所以如果用这种方法传递一个引用,最后实现的时候再new就很快了。
      

  5.   

    A a=new B();属性是不会继承的,只有方法。a.。。B类中的方法还是可以的吧。应该是这样de
      

  6.   

    属性可以继承。但修饰符要注意实际new出来的实列对象还是B
      

  7.   

    我个人觉得有2点需要理解一下:
    (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的对象。