A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李成航 中级黑马   /  2012-3-13 15:11  /  2346 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例如一个类下的多重继承关系,关于继承成员的调用问题:


class A {public void tes(){System.out.println("a");}  }


class B extends A {public void tes(){System.out.println("b");}}

class C extends B {}


public class Test{
public static void main(String[] args){

C c=new C();

c.tes()://我想问此时c对象是调用B的tes方法,还是A的tes方法???

}

}

6 个回复

倒序浏览
应该是B的tes方法,应为子类可以复写父类的方法!B继承了A,所以复写了A的tes方法,C继承B ,所以运行后是从B之中继承来的tes方法!
回复 使用道具 举报
是B的方法,当子类继承父类的时候,子类里面的方法名和父类的一样的时候,此时子类的方法会覆盖父类的方法,所以C继承B的时候,其实是继承了B覆盖了A的方法
回复 使用道具 举报
多态看谁调用谁的方法  是看引用  引用是谁的的就是调用谁的方法
  比如你的代码中  A 创建一个引用 指向子类对象B  看似调用的是b的方法 其实调用的是A父类中的方法
     但是结果为什么是显示子类b中方法的内容呢?  
  这是因为  子类方法把父类方法覆盖了  可以理解为 这时候子类方法 和父类方法的内容是完全一样的   
所以 父类引用其实调用的是父类的方法
  而你创建的是   子类的子类c  的引用  又指向了 C类创建的对象 这个更好理解了
   如果C子类方法中覆盖了父类的方法 那么调用的是c子类的方法  如果没有覆盖  
就像你写的那样   肯定调用的是父类B的方法啊   因为子类C中压根就没有方法     但是要说的一点是 如果B中也没有test方法的话
  那么 肯定调用的是c的父类B的父类A 的方法了  即就是 超类a的方法  直接从c越级到a   
回复 使用道具 举报
调用的是B的tes方法,纠正你一下,java中没有多重继承,只有单继承,你这种情况叫多层继承,基于此,子类继承哪个父类,如果没复写操作,就会继承哪个父类的方法,调用时就调用哪个方法,而不会调用父类的父类的同名方法,况且,父类的父类的同名方法已经被父类复写了,除非你建立一个A类的对象,不然,不可能调用到A的tes方法
回复 使用道具 举报
首先,B类继承了A,然后再B中,重写了test方法,所以呢B中的test已经不再等于他的父类了。 再这之后C又继承了B,所以C中的test一定是B重写之后的test。所以输出b
回复 使用道具 举报
改下C类也复写这个方法 然后A a=new C();问同样的问题呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马