当前位置: 首页 > 知识库问答 >
问题:

Java中的对象类型转换

巫马修为
2023-03-14

我正在努力理解在这段代码中创建的C()对象。

我理解,当它在第3行创建时,它是一个对象,具有A类中的引用。我还了解到,您可以从B类中的引用中引用第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; } }

共有1个答案

司寇望
2023-03-14

A o1 = new C( );

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

O1可以引用类A的任何对象或A的任何子类(如BC)。但是,一旦将类C的对象分配给类型a的变量,则只能使用该变量执行类a(或a的任何超类)中声明的方法。

如果要执行类b的方法,必须告诉编译器,该变量实际上引用了类b的对象(这是真的,因为该变量包含对类c的对象的引用,而类c也是类b的对象的引用,因为c扩展了b)。

这就是演员的作用:

B o2 = (B) o1;

现在,使用变量O2,您可以调用类B中声明的方法

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

这改变了对象还是仅仅改变了它被引用的方式?

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

 类似资料:
  • 主要内容:强制对象类型转换将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的 对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(java.lang.ClassCastException)异常。 Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类

  • 我有一个界面,看起来像 公共接口密钥检索器{ } 我希望实现是这样的 CustomerTypeKeyRetriever(实现类) 我该如何实现这一点。目前它抛出一个编译错误——“类型CustomerTypeKeyRetriever必须实现继承的抽象方法KeyRetriever.getKey(Object)”

  • 本文向大家介绍浅析Java中对象的创建与对象的数据类型转换,包括了浅析Java中对象的创建与对象的数据类型转换的使用技巧和注意事项,需要的朋友参考一下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据类型:基本数据类型(在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型)、引用类型和nu

  • 所以我有一个名为ExpandableArrayList的类,它实现了ListInterface。这个ArrayList填充了Item类型的实例(它表示我的泛型类型T)。class Item实现Comparable,并具有以下属性:String itemNo、String Item Name、double price和int quantity。 一个名为CheckLimit的方法应该检查列表中的任何

  • 如何创建任何类型的类对象(字符串、char、int、浮动、双。短、长、字节、...),以便我可以使用接受类对象的所有类型的链接列表

  • 问题内容: 就性能而言,对象类型转换的代价是多少? 在可能的情况下,我应该尽量避免进行类型转换吗? 问题答案: 它足够便宜,因此属于过早优化类别。除非您已对应用程序进行了概要分析并确定这是一个问题,否则不要浪费时间甚至就此思考或提问,最重要的是:不要为了避免它而妥协您的设计。