【问题标题】:Argument input and sideffect in subclass method子类方法中的参数输入和副作用
【发布时间】:2018-08-26 21:38:57
【问题描述】:

关于以下情况:

public class A {
   int x=3;
   public A() {
      setX(x-3);
   }
   void setX(int z) {
      this.x = z; 
   }
}


public class B extends A        {
   static int x = 7;
   void setX(int z) {
      x = z;
   }
}


public class Main {
   public static void main(String[] args) {
      A ab = new B();
      System.out.println(B.x);
   }
}

输出:0

我已经熟悉这样一个事实,即在我们以这种方式创建对象时执行子类的方法。

从输出来看,B类中的setX方法将继承的x作为参数,但对静态变量有副作用。这种行为是否有名称或更一般的解释?例如,不了解的人可能会认为,该方法将静态变量作为参数,并对继承的变量产生副作用。

【问题讨论】:

  • 输出不是你说的3。输出为 0。
  • 是的,我现在在问题中更改了它。
  • “是否有此行为的名称或更一般的解释” - 为什么?请注意,B.xxA 中的关系绝对为零,它们 100% 不相关。您只是在调用一个带有参数的方法,该方法被覆盖,就是这样。
  • 您是指System.out.println(B.x); 中的ab.x 还是B.x

标签: java inheritance arguments subclass side-effects


【解决方案1】:

这应该是抽象的执行流程:

  1. B 的构造函数被调用。隐式调用 A 的默认构造函数。
  2. 内部 A 的构造函数 setX(x-3) 被调用。对于类型 A,x 定义为包私有成员,初始化为 3,这将导致 setX(0) 被调用。
  3. 多态性出现:A ab 在编译时属于 A 类型,但在运行时属于 B 类型。这会导致调用 B 类型的 setX(0)
  4. 静态变量 x 设置为 0。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2019-06-26
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多