2013-11-24 50 views
0

我有一个主类,A类和B类(B类继承自A)。关于类的语法(Java)

从我的主要我创建一个数组并具有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)困惑的方法。 (这两个类都有一个称为分析器的方法)。我不明白它的意义(为什么有一个(A)和(B)之前的标签,目的是什么),我的猜测是,我们调用的数组,但类A - >( A)和(B)分别...但它不能说服我。

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

+0

你在使用? – drf

+0

Java语言(不是Java脚本) – NaC114

+0

它是一个完整的例子吗?因为显然'tab [2]'是未初始化的。无论如何,事情是'Object'没有方法'analyse',所以你把对象转换成类'A'或'B'。 “A”数组将删除此要求(除非方法被声明为“final”)。 – keltar

回答

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的数组,并且Object不包含analyser方法,因此需要将其转换为定义要调用的方法的类(此处为analyser)。

尽管tab[0]被定义为B的一个实例,但它可以向上投射到派生较少的类型A。在这种情况下,调用(((A)tab[0]).analyzer(tab[1])和(((B)tab[0]).analyser(tab[1]))相同的功能,即使B具有为analyser自己的定义。(这个概念被称为多态性。)