java - 在 Java 中转换引用变量

标签 java reference casting

关于在 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/

相关文章:

c# - 添加一个实例以引用另一个实例中的字段

c++ - 函数重载优先级(引用)

c - 为什么 Kernighan 和 Ritchie 包含看似不必要的类型转换?

android - 如何将字符串变量设置为 ImageView 资源?

java - 请放心 : Verify xml value for of child tags

java - 为什么我的 List<Long> 包含整数?

java - 在 JavaFX 中实现 Ace 代码编辑器

java - 如何在多级继承中访问父类(super class)的相似字段

c# - 在 C# 中的 Sitcone 在 etc 中找不到

java - 错误的泛型转换没有 ClassCastException [Java]