将继承类的对象分配给超类对象

时间:2017-01-06 17:28:09

标签: java inheritance

我有两个给定的A和B类。 B继承自A.

现在在M类的主要方法中有一个A的实例z 这指向B的对象。

我知道如果将继承类的对象分配给超类,则子类的方法会保留。

问题:为什么z.(-6)使用了B的方法f(double y)而不是f(int y)? 换句话说:你能解释为什么输出给出-8.0和4.0吗?

public class A {
   public int x = 2;

   public A() {
      this.x+++;
   }

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

   public void f(double x) {
      this.x = (int) (x + B.y);
   }
}


public class B extends A {
   public static double y = 3;

   public double x = 0;

   public B(double x) {
      y++;
   }

   public void f(int y) {
      this.x = y * 2;
      B.y = 0;
   }

   public void f(double y) {
      this.x = 2 * y + B.y;
   }
}


public class M {
   public static void main(String[] args) {
   A a = new A((int) B.y);
   System.out.println(a.x); // OUT: [5]

   B b = new B(2);
   System.out.println(b.x + " " + B.y); // OUT: [0.0] [4.0]

   A z = b;
   System.out.println(z.x); // OUT: [3]

   z.f(-0.5);
   System.out.println(b.x + " " + z.x); // OUT: [-6.0] [3]

   z.f(-6);
   System.out.println(b.x + " " + B.y); // OUT: [-8.0] [4.0] 
   }
}

1 个答案:

答案 0 :(得分:1)

在您的示例中,z引用而不是对象。 z实际上指向B实例,无论编译器是否知道它。

  

那么为什么z。( - 6)使用B的方法f(double y)而不是f(int y)?

您已告诉编译器z是对A的引用,并且只有一个方法f(double)可以被覆盖但不会被子类重载。

即。调用方法的签名是在编译时确定的(编译器的类型),而不是运行时(不是实际类型)