在 Java 中转换的对象类型

Object type cast in Java

我很难理解在此代码中创建的 C() 对象。

我了解到,当它在第 3 行创建时,它是一个在 A class 中引用的对象。我还了解到,您可以从 B class 中的引用引用第 4 行中的同一对象。但是,我不明白第 4 行引用 o1 的转换。这会改变对象还是改变它的引用方式?

非常感谢您的解释:)谢谢

public class TestClass{
   public static void main(String args[ ] ){
      A o1 = new C( );
      B o2 = (B) o1;
      System.out.println(o1.m1( ) );
      System.out.println(o2.i );
   }
}
class A { int i = 10;  int m1( ) { return i; } }
class B extends A { int i = 20;  int m1() { return i; } }
class C extends B { int i = 30;  int m1() { return i; } }

A o1 = new C( );

您将类型为 C 的对象分配给类型为 A 的变量。

o1 可以引用 class A 的任何对象或 A 的任何子 class (例如 BC).但是,一旦将 class C 的对象赋值给 A 类型的变量,就只能使用该变量来执行 class A 中声明的方法(或 A 的任何超级 class)。

如果要执行classB的方法,必须告诉编译器这个变量实际上引用了classB的一个对象(这是真的,因为该变量持有对 class C 的对象的引用,该对象也是 class B 的对象,因为 C 扩展了 B) .

这就是演员表的用途:

B o2 = (B) o1;

现在,使用变量 o2,您可以调用 class B.

中声明的方法

但是,由于所有 3 个 classes 都声明了具有相同签名 (int m1( )) 的方法,因此强制转换不允许您调用无法通过 o1变量。但是,它确实允许您访问 class B 的实例变量 i(通过编写 o2.i)。

Does this change the object or just how it is referenced?

它不会改变对象。它只是为编译器提供有关该变量引用的对象的实际类型的更多详细信息。