【问题标题】:In Java, why does a child stored as a parent call the parent's static methods, but access the child's static data members?在Java中,为什么存储为父级的子级调用父级的静态方法,却访问子级的静态数据成员?
【发布时间】:2014-09-06 06:45:52
【问题描述】:

假设你有两个类如下:

class A{
  static int statint = 5;
  int instanceint = 5;
  public void instanceMethod(){}
  public static void staticMethod(){}
}

class B extends A{
  static int statint = 6;
  int instanceint = 6;
  public void instanceMethod(){}
  public static void staticMethod(){}
}

然后你实例化如下:

public static void main(String[] args){
  A basa =new B();  //child(B) stored as parent(A) type
  int i=basa.statint; /**gives you (child)B's static data member (6)**/
  int j=basa.instanceint; //gives you (parent)A's instance data member (5)
  basa.instanceMethod(); //calls (child)B's instanceMethod() version. 
  basa.staticMethod();   /**call's (parent)A's staticMethod() version.**/
}

我的问题是:为什么子类的静态方法可以隐藏父类的静态数据成员,而不能隐藏父类的静态方法?我认为两者都不是或两者兼而有之。

(我知道解决这个问题的方法 - 例如,对于静态数据成员/方法访问,使用 ClassName.datamemberClassName.method() 表示法以确保调用正确的版本,例如变量,明确地将孩子降级为访问变量时存储在子类型中,和((B)basa).instanceint;一样,获取B的实例数据成员—— 我的问题更多是因为我自己理解为什么隐藏静态数据成员和从实例访问的隐藏静态方法的默认值似乎不一致。)

【问题讨论】:

标签: java inheritance static


【解决方案1】:

其实你的评论:

/** gives you (child)B's static data member (6) **/

错了。 i的值为5,这里Java是一致的。

【讨论】:

  • 对不起。它一定是我的代码中的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2011-10-12
相关资源
最近更新 更多