显式转换调用构造函数?

时间:2017-01-07 13:46:25

标签: java oop casting static

我有两个班级AB

问题:为什么行System.out.println(b.x)会打印23?

我同意22作为结果,因为A的构造函数和B的构造函数都将static int y递增1.

public class A {
   public long x = 0;
   public static int y = 20;

   public A(float x) {
      this((int) x );
      A.y++;
   }

   public A(int x) {
      this.x = x;
   }

   public int f(double d) {
      return 1;
   }

   public int f(long l) {
      return 2;
   }
}

public class B extends A {
   public int x = 1;

   public B() {
      this(42);
      B.y++;
   }

   public B(int x) {
      super(x + 0.f);
      this.x += this.x;
   }

   public int f(long l) {
      return 3;
   }

   public int f(float f) {
      return 4;
   }
}


public class M {
   public static void main(String[] args) {

   A a = new A(10f);
   System.out.println(a.x);

   System.out.println(A.y);

   B b = new B();
   System.out.println(((A b).x); // 23
}    

2 个答案:

答案 0 :(得分:4)

b.y23,因为B构造函数也使用A调用super(x + 0.f);构造函数。

因此y增加3次,A a = new A(10f);增加1次,B b = new B();增加2次

答案 1 :(得分:1)

首先我相信你想把这行代码写成   System.out.println(((A b).y); // 23

而不是

System.out.println(((A b).x); // 23

所以我的解释是:

在M级系列中正在进行调用,这使得你的b.y打印23

20 - > 21

  1. 通过传递浮点值来调用A的构造函数。 重载构造函数将静态y递增1。
  2. 1st image

    <强> 21-&GT; 22

    1. B的空参数构造函数称为B b = new B(), 初始化x因此调用B的整数构造函数。

      Image 2

    2. enter image description here

      使用float参数调用A的构造函数。

      1st image

      <强> 22-23 3.完成上述调用后,控件将返回带有空参数的默认重载构造函数。

      enter image description here