黑马程序员技术交流社区

标题: 关于多态和子类复写父类方法问题,为什么不是输出son7,s? [打印本页]

作者: 杨海波    时间: 2012-6-2 21:31
标题: 关于多态和子类复写父类方法问题,为什么不是输出son7,s?
  1. class Father{

  2. public static int a = 5;
  3. public int b = 6;
  4. public static void x(){
  5. System.out.println("f");
  6. }


  7. public void print(int i){
  8. System.out.println("father"+i);
  9. }

  10. }

  11. class Son extends Father{
  12. public int b = 7;


  13. public void print(int i){
  14. System.out.println("son"+i);
  15. }

  16. public static void x(){
  17. System.out.println("s");
  18. }
  19. }


  20. public class Demo {

  21. public static void main(String[] args) {
  22. Father father = new Son();
  23. father.print(father.b);
  24. father.x();
  25. }

  26. }
复制代码
结果输出为son6和f
是因为静态父类的成员被隐藏了,调用时会调用隐藏的而不会去调用子类的成员吗?求高人指点?

作者: 刘伯阳    时间: 2012-6-2 21:48
本帖最后由 刘伯阳 于 2012-6-2 21:49 编辑

这是一个父类引用指向子类对象的典型问题。
前面首先你定义Father father = new Son();
然后father.print(father.b);  由于Son继承Father,所以他的属性b也被继承了下来  所以b = 6。
至于为什么输出了f,是因为x()方法你定义的是个静态的,后面你用father.x();   无异于静态成员方法的访问   Father.x();
其实最后一句相当于Father.x();  
所以会输出f。
作者: 朝哥    时间: 2012-6-2 22:26
父类引用指向子类对象的时候。如果是成员方法的话是子类复写父类,成员变量的话是调用父类的成员变量!
一句话:在多态的情况下,方法是子类的方法,变量是父类的变量。
作者: 张少威    时间: 2012-6-2 22:31
由于Son继承Father,所以他的属性b也被继承了下来  所以b = 6。

这个不对。方法可以运行时动态绑定,属性是不可以的,而不是因为继承了父类的属性b,子类中有属性b的定义,怎么还会继承。
作者: 何拴绪    时间: 2012-6-2 23:02
该问题是多态里的父类引用指向子类对象,也叫动态连接。Father father = new Son();这句实际就是父类的引用指向子类的对象,
该父类引用在掉用方法和成员变量时是有区别的,调用方法时是子类重写了父类的方法,所以它自动调用子类的print方法,但是在访问成员变量时,子类继承了父类,所以会有两个同名的成员变量b,父类的成员变量对父类的引用是可见的所以会访问父类的成员变量b=6。
father.x() 就是访问静态方法的原理。
总结如下:父类引用指向子类对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.





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