我有一个主要的A类和B类(B类继承自A)。
从我的主要我创建一个数组,并在A和B的内部。
Object[] tab = new Object[7];
tab[0] = new B(-10);
tab[1] = new A();
然后我调用类
中的方法((A) tab[2]).analyser(tab[1]);
((B) tab[5]).analyser(tab[1]);
关于(A)和& (B)。 (这两个类都有一个名为analyzer的方法)。我不明白它的意义(为什么在选项卡之前有(A)和(B),目的是什么),我的猜测是,我们调用数组但是在A类的形状 - > (A)和(b)分别......但它并不能说服我。
这是更大编码的一部分,但我希望这足以得到我的答案。
答案 0 :(得分:0)
实际上,此代码可以等效地表示如下:
A[] tab = new A[7];
tab[0] = new B(-10); // permitted since B derives from A
tab[1] = new A();
// ...
tab[2].analyser(tab[1]);
tab[5].analyser(tab[1]);
通常,在声明数组时,最好使用最具体的类型,该类型可以包含数组预期容纳的所有对象。如果数组期望包含任何对象(字符串,其他数组,A
等),则只能将其声明为object[]
(并存储从Object
继承的任何类型)。如果只希望数组包含从A
派生的类型(例如,A
和B
),则可以将其声明为A[]
并存储任何继承的类型来自A
(例如A
和B
)。
在原始代码中,语法((A)tab[2])
用于将tab[2]
转换为更加派生的类型(在本例中为A
);它实质上告诉编译器,“将tab[2]
视为声明为A
”。由于tab
被定义为Object
s的数组,并且Object
不包含analyser
方法,因此您需要强制转换为定义所需方法的类调用(这里analyser
)。
即使将tab[0]
定义为B
的实例,也可以将其向上转换为较少派生的类型A
。在这种情况下,调用(((A)tab[0]).analyzer(tab[1])
和(((B)tab[0]).analyser(tab[1])
)在功能上是等效的,即使B
为analyser
提供了自己的定义。(这个概念称为多态。 )