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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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
是因为静态父类的成员被隐藏了,调用时会调用隐藏的而不会去调用子类的成员吗?求高人指点?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 鼓励一下~~

查看全部评分

4 个回复

倒序浏览
本帖最后由 刘伯阳 于 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。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
父类引用指向子类对象的时候。如果是成员方法的话是子类复写父类,成员变量的话是调用父类的成员变量!
一句话:在多态的情况下,方法是子类的方法,变量是父类的变量。
回复 使用道具 举报
由于Son继承Father,所以他的属性b也被继承了下来  所以b = 6。

这个不对。方法可以运行时动态绑定,属性是不可以的,而不是因为继承了父类的属性b,子类中有属性b的定义,怎么还会继承。
回复 使用道具 举报
该问题是多态里的父类引用指向子类对象,也叫动态连接。Father father = new Son();这句实际就是父类的引用指向子类的对象,
该父类引用在掉用方法和成员变量时是有区别的,调用方法时是子类重写了父类的方法,所以它自动调用子类的print方法,但是在访问成员变量时,子类继承了父类,所以会有两个同名的成员变量b,父类的成员变量对父类的引用是可见的所以会访问父类的成员变量b=6。
father.x() 就是访问静态方法的原理。
总结如下:父类引用指向子类对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马