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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nicholyx 中级黑马   /  2014-3-18 20:45  /  1075 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于静态成员的继承与多态问题
下面的代码有点不明白,请大神详细解释下。

  1. class A
  2. {
  3.         public static int x=1;
  4.         public static void printa()
  5.         {
  6.                 System.out.println(x);
  7.         }
  8. }

  9. class B extends A
  10. {
  11.         public static int x=100;
  12.         public static void printb()
  13.         {
  14.                 System.out.println(x);
  15.         }
  16. }

  17. class Demo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 A a = new A();
  22.                 a.printa();   //1

  23.                 B b = new B();
  24.                 b.printa();   //1
  25.                 b.printb();   //100

  26.                 A ab = new B();
  27.                 ab.printa();   //1
  28.         }
  29. }
复制代码


4 个回复

倒序浏览
从主函数看起,首先,新建了个A类的对象,然后调用了A类中的printa()的方法,打印出来的自然是1
然后,新建了个B类对象,由于B类对象继承了A类对象,所以A类中所有方法B类中都可以调用或者复写,然后其调用了A类中的printa()方法,而A类方法中有个成员变量就是x=1,并且该成员变量是静态的,静态成员是随着类的加载就已经加载了的,而且静态成员是不能被子类所复写,相当于在B类对象之前就已经存在了,故打印出来的也是1,
最后的多态也是一样的,访问到的都是静态,都已经随着类的加载而加载

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
这是对静态的理解问题,静态是共享数据随着类的加载而加载,存在静态绑定,默认调用都是属于自己的成员,如果子类要调用父类中的同名静态成员变量可以使用类名.变量名加以区分即可.
回复 使用道具 举报
本帖最后由 duanyoujiji 于 2014-3-18 22:08 编辑

静态成员和静态函数优先于对象存在。
简单的说就是:
在多态中,静态成员变量和静态成员函数无论在编译和运行的时候都只看左边(引用型变量所属的类)。
回复 使用道具 举报
由于静态成员变量是随着类的加载而加载的,并且静态成员变量是不可以被子类重写的,因而,当程序从main开始执行后,首次建立A对象,加载了类后便直接加载A类中的静态成员变量x,所以第一个调用printa()方法中打印的是A类中的x,第二建立B对象后由于静态成员变量不能被重写,故而调用printa()方法时打印的仍然是A类中的x变量,即:1;调用printb方法时打印的时B类的x变量,即:100。在最后的多态中,还是由于同样的原因(即静态成员不能被重写)打印的时A 类中的x即:1

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马