您可以在java中向下转换对象而不声明新变量吗?

您可以在java中向下转换对象而不声明新变量吗?,java,inheritance,object,polymorphism,downcast,Java,Inheritance,Object,Polymorphism,Downcast,我试着做一些类似的事情 class O has a child E 我声明变量 O xyz = new E(); 但是如果我调用xyz.method(),我只能调用类O的方法中的那些,而不能调用类E的方法,所以我可以通过 E xyz2 = (E) xyz; 我的问题是-您可以在不声明新变量的情况下执行此操作吗?比如: O xyz = new E(); xyz = (E) xyz; 现在我可以使用xyz.method()调用E的方法 在java中有这样做的方法吗?是的,您可以使用down

我试着做一些类似的事情

class O has a child E
我声明变量

O xyz = new E();
但是如果我调用xyz.method(),我只能调用类O的方法中的那些,而不能调用类E的方法,所以我可以通过

E xyz2 = (E) xyz;
我的问题是-您可以在不声明新变量的情况下执行此操作吗?比如:

O xyz = new E();
xyz = (E) xyz; 
现在我可以使用xyz.method()调用E的方法

在java中有这样做的方法吗?

是的,您可以使用downcast

((E)xyz).method();
如果父类(O)也有一个方法xyz,则可以调用

O xyz = new E();
xyz.method();   // E's xyz would be called

这是多态性

否,您不能在声明变量后更改其类型

您可以内联类型转换,如果只需要向下转换一次,则可以节省一些输入:

Number n = 1;
((Integer)n).someIntegerMethod();

但是,如果需要多次创建新变量,则可能需要创建一个新变量。编译器可能足够聪明,也可能不够聪明,无法正确地对此进行优化(这样会导致重复类转换的运行时开销)。

您不能这样做:

O xyz = new E();
xyz = (E) xyz; 
xyx.someEMethod(); // compilation error
原因是Java对象的类型转换实际上不会更改任何值。相反,它们根据对象的实际类型执行类型检查

您的代码检查
xyz
的值是否为
E
,但随后将类型转换的结果分配回
xyz
(第二条语句),从而再次将其向上转换回
O

但是,您可以这样做:

((E) xyx).someEMethod(); // fine

typecast周围的括号是必不可少的,因为“.”运算符的优先级高于typecast。

然而,他说情况并非如此。只有子类有他想要调用的方法。然后他应该只声明E xyz=new E(),或者在O中创建一个抽象方法xyz。这个问题的标签是多态性,这将显示多态性行为(将变量声明为他实际需要的类型)将是最好的方法。不过,我假设这是一个简化的例子。正如@Leon指出的,如果您以后(在同一范围内)需要
xyz
类型为
E
,您将永远不会编写
O xyz=newe()
,而是声明正确的类型
E xyz=newe()
。但我假设你的真实代码比这个例子更难,但这不是OP要问的。OP在问“我可以向下转换并重新分配回原始变量吗?”这与问“我可以在声明后重新定义变量的类型吗?”是相同的答案