子类方法中的参数输入和副作用

时间:2018-03-18 03:13:35

标签: java inheritance arguments subclass side-effects

这是关于以下情况:

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作为参数,但对静态变量有副作用。是否有此行为的名称或更一般的解释?不熟悉的人可以想一想,该方法将静态变量作为参数,并对继承的变量产生副作用。

1 个答案:

答案 0 :(得分:0)

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

  1. 调用B的构造函数。隐式地调用A的默认构造函数。
  2. 调用内部A的构造函数x。对于类型A setX(0)被定义为使用3初始化的包私有成员,这将导致调用A ab
  3. 多态性开始:setX(0)在编译时是A类型,但在运行时是B类型。这导致名为B的蜜蜂String input = "-4, 2, -5, 0, 3"; input.replaceAll("\\s",""); // Replaced all spaces/whitespace, now we have "-4,2,-5,0,3" String[] arr = input.split(",") // Split on the commas System.out.println(arr[0]); // Will print -4 System.out.println(arr[1]); // Will print 2, etc.
  4. 静态变量x设置为0.