Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 - Fatal编程技术网

Java 理解继承中的类型转换

Java 理解继承中的类型转换,java,Java,我正在准备java认证,但找不到这背后的任何概念或逻辑。 有谁能帮助我理解多重类型转换的概念吗。我可以理解类型转换的一个级别,但我没有得到这些转换的任何信息。 这是我试图理解的示例 interface I{ } class A implements I{ } class B extends A { } class C extends B{ } A a = new A(); B b = new B(); 现在,选项1在编译时或运行时没有任何错误,而第二个选项有错误。我在eclipse中运行

我正在准备java认证,但找不到这背后的任何概念或逻辑。 有谁能帮助我理解多重类型转换的概念吗。我可以理解类型转换的一个级别,但我没有得到这些转换的任何信息。 这是我试图理解的示例

interface I{
}
class A implements I{
}

class B extends A {
}

class C extends B{
}

A a = new A();
B b = new B();
现在,选项1在编译时或运行时没有任何错误,而第二个选项有错误。我在eclipse中运行它,但无法理解其背后的逻辑

1.  a = (B)(I)b;
2.  b = (B)(I)a;

你的问题有点含糊,但我会看看是否能帮上忙

所以你有你的接口I和类A,B和C

您现在可以执行以下操作:

I i1 = new A();
I i2 = new B();
I i3 = new C();
这是可能的,因为通过继承,所有类A、B和C都实现了I

你也可以

A a1 = new B();
A a2 = new C();
B b1 = new C();
出于几乎相同的原因(不同之处在于它们是在扩展接口,而不是实现接口)

到现在为止,你可能已经猜到你也能做到

A a1 = new B();
A a2 = new C();
B b1 = new C();
你不能做的事情就像

B b = new A(); // Type error
C c = new B(); // Type error
B b2 = (B)new A(); // ClassCastException
这是不可能的,因为类型A不从B延伸

通常,在这些情况下,您不需要显式地键入cast

I i = (I)new A(); // <- not necessary
实际的对象(我将称之为o)是类A的一个实例。您还有一个名为“A”的对象引用,它被类型化为A,它引用对象o

指定其他对象参照时,实际对象的类型不会更改。指定引用时,对象的类型必须与引用的类型相同,或者是从引用的类型继承的类型

例如,可以指定类型I的引用:

I i = a;
这将引用i分配给a引用的同一对象,即对象o。注意,o仍然是A型

   System.out.println(i instanceof A);
将打印
true

不清楚你到底在问什么-这只是两个类型转换,一个接一个地完成。如果你明白什么是
x+y
,那么你就应该明白
x+y+z
的意思,因为同样的事情要做两次;这有什么不同?你的中间段有点凌乱,重新措辞可能有助于得到答案。可能也有助于解释你所说的“正确”是什么意思,因为在行业中,这两个词都被认为是非常不正确的(我相信这是我有生以来第一次看到双重演员,而且我不得不在工作中阅读很多蹩脚的代码)。我认为这是“不会引起错误的”,在这种情况下,我建议你自己运行代码,然后如果你不理解为什么它是这样,那么把你的问题改写为“为什么X工作而不是Y?”可能会更好,我可以重新措辞。Kaya我知道这是两种类型的强制转换,但你能告诉我为什么第一种是正确的,第二种是错误的。没有理由将强制转换包含到
I
,强制转换不会改变对象的任何内容。你的数字2相当于
bb=(B)a谢谢你的回答,但我理解一级演员阵容。我已重新措辞了这个问题。你能告诉我为什么第一个选项是正确的而第二个选项是错误的吗?案例1很好,因为B是a的一个子类。不过,铸造完全没有必要。案例2不起作用,因为A不是B的子类。您只能强制转换到层次结构中较高的类型。@kaya3谢谢您指出这一点。我会更新答案。