关于在 Java 中转换引用变量,我有一些不清楚的地方。
我有两个类 A 和 B。A 是 B 的父类(super class)。 如果我有这两个对象,然后打印语句:
A a = new A(); //superclass
B b = new B(); //subclass
System.out.println ((A)b);
那么当执行 println 方法时到底发生了什么?
我知道因为 B 是 A 的子类,所以我可以进行以下转换:
A a2 = (A)b;
我还知道,当 println 将引用变量作为参数时,会调用创建对象参数的类的 toString() 方法(隐式)。之所以如此,是因为 println() 方法正在寻找 String 类型的参数,而 toString() 方法将对象表示为字符串。即使我们不编写 toString(),该方法也会被隐式调用。所以,下面两个语句是等价的:
System.out.println (b);
System.out.println (b.toString());
所以,我的问题是:当我们有
System.out.println ((A)b);
?
我假设引用变量 b 的类型自动从 B 更改为 A。该变量仍应指向同一个对象 - 用
创建的对象B b = new B();
但现在只有 b 的类型会改变。它是否正确? 另一个问题:即使我已经将 b 的类型更改为父类(super class)的类型,子类中的重写方法是否会被调用,而不是父类(super class)的方法?
非常感谢。
问候
最佳答案
在这种情况下,转换没有影响。
System.out.println(XXX) 采用不同类型的参数(多个重载版本),但在这种情况下,您将获得采用 Object 的版本。由于 Java 中的每个对象都支持 toString(),因此无论实际参数是什么,都会调用 toString。
现在,由于Java中的所有方法都是动态调度的,所以运行的版本就是动态类型对应的版本。将 B 的对象转换为 A 只会更改表达式的静态(已声明)类型。动态类型(真正的内容)仍然是 B。因此,调用 B 中的版本。
关于java - 在 Java 中转换引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497772/