关于类的语法(Java)

时间:2013-11-24 09:02:23

标签: java class inheritance

我有一个主要的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)分别......但它并不能说服我。

这是更大编码的一部分,但我希望这足以得到我的答案。

1 个答案:

答案 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派生的类型(例如,AB),则可以将其声明为A[]并存储任何继承的类型来自A(例如AB)。

在原始代码中,语法((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]))在功能上是等效的,即使Banalyser提供了自己的定义。(这个概念称为多态。 )