Java中的对象类型转换
我正在努力理解在这段代码中创建的C()对象 我知道当它在第3行创建时,它是一个对象,引用在A类中。我还了解到,您可以通过B类中的引用在第4行引用相同的对象。但是,我不理解第4行中引用o1的转换。这会改变对象还是仅仅改变它的引用方式 非常感谢您的解释:)谢谢 在 将Java中的对象类型转换,java,class,object,casting,Java,Class,Object,Casting,我正在努力理解在这段代码中创建的C()对象 我知道当它在第3行创建时,它是一个对象,引用在A类中。我还了解到,您可以通过B类中的引用在第4行引用相同的对象。但是,我不理解第4行中引用o1的转换。这会改变对象还是仅仅改变它的引用方式 非常感谢您的解释:)谢谢 在 将C类型的对象指定给a类型的变量 o1可以引用类A的任何对象或A的任何子类(例如B和C)。但是,一旦将类C的对象分配给类型a的变量,则只能使用该变量执行类a中声明的方法(或a的任何超类) 如果要执行类B的方法,必须告诉编译器该变量实际上引
C
类型的对象指定给a
类型的变量
o1
可以引用类A
的任何对象或A
的任何子类(例如B
和C
)。但是,一旦将类C
的对象分配给类型a
的变量,则只能使用该变量执行类a
中声明的方法(或a
的任何超类)
如果要执行类B
的方法,必须告诉编译器该变量实际上引用了类B
的对象(这是真的,因为该变量引用了类C
的对象,而类B
,因为C
扩展了B
)
这就是演员阵容的目的:
B o2 = (B) o1;
现在,使用变量o2
,可以调用类B
中声明的方法
但是,由于所有3个类都声明了具有相同签名的方法(intm1()
),因此强制转换不允许您调用无法通过o1
变量调用的方法。但是,它确实允许您访问类B
的实例变量i
(通过编写o2.i
)
这会改变对象还是仅仅改变它的引用方式
它不会改变对象。它只是向编译器提供有关该变量引用的对象的实际类型的更详细信息。在Java中强制转换引用不会更改对象,只会更改引用的类型。你也让你的例子很混乱,因为你同时重写了一个方法和隐藏了一个字段。是的,这是一个练习题,我通常不会写这样的代码。我主要不明白为什么输出是3020@Tommymitch因为当你将A转换为C时,它调用
C::m1
,返回30,而对于20-i
的完全相同的答案被隐藏,m1
被覆盖。第4行是什么?“你只能使用该变量执行方法”和访问字段。@AndyTurner是的,通过“only”我的意思是,您不能通过o1
执行类B
和C
中声明的方法。这同样适用于实例变量(尽管它通常不相关,因为实例变量通常是私有的)。
A o1 = new C( );
B o2 = (B) o1;