Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解决上行/下行问题_Java_Casting_Scjp_Ocpjp - Fatal编程技术网

Java 解决上行/下行问题

Java 解决上行/下行问题,java,casting,scjp,ocpjp,Java,Casting,Scjp,Ocpjp,是否有人有任何可行的策略来解决铸造/向上铸造问题?我理解什么时候允许上下转换,但是当问题涉及多个对象时,我很快就会感到困惑。例如,找到此类问题答案的最佳方法是什么: 问题:编译以下程序的结果是什么: 我不是真的对答案感兴趣,而是对解决问题的方法感兴趣。是否有任何方法/策略可用于解决上述向上/向下投射问题?例如,可以在纸上绘制参考/对象,以便获得视觉表示,这有帮助吗 谢谢这里有一些简单的规则 您可以强制转换到类PreDescssor(一直到对象)(从不使用fais) 您可以强制转换到子类-这可能

是否有人有任何可行的策略来解决铸造/向上铸造问题?我理解什么时候允许上下转换,但是当问题涉及多个对象时,我很快就会感到困惑。例如,找到此类问题答案的最佳方法是什么:

问题:编译以下程序的结果是什么:

我不是真的对答案感兴趣,而是对解决问题的方法感兴趣。是否有任何方法/策略可用于解决上述向上/向下投射问题?例如,可以在纸上绘制参考/对象,以便获得视觉表示,这有帮助吗


谢谢

这里有一些简单的规则

  • 您可以强制转换到类PreDescssor(一直到对象)(从不使用fais)
  • 您可以强制转换到子类-这可能会在运行时失败
  • 您可以从实现它的类强制转换到接口(永不失败)
  • 您可以从interafce强制转换到iPlementing类-这可能会在运行时失败
前两条规则也适用于ti接口


您可以通过绘图将其可视化(仅使用implements=realizes、extends realetions),在图形中按箭头方向导航是安全的。另一种导航方式是运行时usafe。没有extends/implements关系就无法导航。

有一些简单的规则

  • 您可以强制转换到类PreDescssor(一直到对象)(从不使用fais)
  • 您可以强制转换到子类-这可能会在运行时失败
  • 您可以从实现它的类强制转换到接口(永不失败)
  • 您可以从interafce强制转换到iPlementing类-这可能会在运行时失败
前两条规则也适用于ti接口

您可以通过绘图将其可视化(仅使用implements=realizes、extends realetions),在图形中按箭头方向导航是安全的。另一种导航方式是运行时usafe。没有extends/implements关系的导航是不可能的。

这里有一个关于向上和向下转换的示例

引自文章--

首先,您必须了解,通过强制转换,您实际上并没有改变对象本身,您只是给它添加了不同的标签。

只要问自己“对象的类型是什么?”这个问题,然后记住将其强制转换到类继承权中的任何前置类(包括接口)都是合法的

在本例中,您将创建两个对象,一个
基对象
派生对象
Base
可以标记为
Inter
Base
,而
派生的
可以标记为
Inter
Base
派生的
。因此,您的代码可以很好地编译。但是在运行时,当您尝试将
Base b
强制转换为
派生的bd
时,您将得到一个ClassCastException。

下面是一个关于向上和向下强制转换的示例

引自文章--

首先,您必须了解,通过强制转换,您实际上并没有改变对象本身,您只是给它添加了不同的标签。

只要问自己“对象的类型是什么?”这个问题,然后记住将其强制转换到类继承权中的任何前置类(包括接口)都是合法的


在本例中,您将创建两个对象,一个
基对象
派生对象
Base
可以标记为
Inter
Base
,而
派生的
可以标记为
Inter
Base
派生的
。因此,您的代码可以很好地编译。但是在运行时,当您尝试将
Base b
强制转换为
派生的bd
时,您将得到一个ClassCastException。

如果正在操作的对象位于同一层次结构中,强制转换将确实编译,但在运行时可能失败

例如:

如果你写:

Animal animal = new Animal();
Dog d = (Dog) animal;
上面的代码将被编译,但在运行时会失败。因为编译器所能做的就是检查这两种类型是否在同一个继承树中。编译器允许在运行时工作的东西。但是,如果编译器确信某些东西永远不会工作,它将在运行时本身抛出错误。例如

Animal animal = new Animal();
Dog d = (Dog) animal;
String s = (String) animal;
这肯定会失败,因为编译器知道String和Dog不在同一层次结构中

同样的规则也适用于接口


希望有帮助。

如果操作的对象在同一层次结构中,则强制转换肯定会编译,但在运行时可能会失败

例如:

如果你写:

Animal animal = new Animal();
Dog d = (Dog) animal;
上面的代码将被编译,但在运行时会失败。因为编译器所能做的就是检查这两种类型是否在同一个继承树中。编译器允许在运行时工作的东西。但是,如果编译器确信某些东西永远不会工作,它将在运行时本身抛出错误。例如

Animal animal = new Animal();
Dog d = (Dog) animal;
String s = (String) animal;
这肯定会失败,因为编译器知道String和Dog不在同一层次结构中

同样的规则也适用于接口


希望有帮助。

对于我来说,我想先画出这些类型的层次结构。对于您的问题,类型的“级别”是:


Inter
(高于)

Base
(高于)

派生的


对象的“级别”是在其创建时确定的,根据其创建级别,对象只能向上而不能向下。例如,对象
b
被创建为
Base
对象,因此它处于
Base
级别。您可以很容易地发现
b
可以向上转换为
Inter
,但不能向下转换为
派生的
,无论使用何种类型来描述b。如果使用
Inter
来描述b,由于其创建级别为
Base
,因此可以将其向下转换为
Base