关于类的语法(Java)
我有一个main、class a和class B(class B继承自a) 从我的主数组中,我创建了一个数组,在A和B的内部都有一个数组关于类的语法(Java),java,class,inheritance,Java,Class,Inheritance,我有一个main、class a和class B(class 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的
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的方法)。我不明白它的意义(为什么在tab之前有一个(A)和(B),以及它的用途),我的猜测是,我们正在调用数组,但分别是类A->(A)和(B)的形状。。。但这不能说服我
这是一个更大的编码的一部分,但我希望这足以得到我的答案。有效地说,这段代码可以等价地表示为:
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
等),则只能将其声明为对象[]
(并存储从对象继承的任何类型)。如果数组只希望保存从A
派生的类型(例如A
和B
),则可以将其声明为A[]
,并存储从A
继承的任何类型(例如A
和B
)
在原始代码中,语法((A)tab[2])
用于将tab[2]
转换为更派生的类型(在本例中为A
);它本质上告诉编译器,“将选项卡[2]
视为声明为A
”。由于选项卡
被定义为对象
的数组,并且对象
不包含分析器
方法,因此需要强制转换到定义要调用的方法的类(此处为分析器
)
即使选项卡[0]
被定义为B
的实例,它也可以向上转换为派生程度较低的类型a
。在这种情况下,调用(((A)tab[0]).analyzer(tab[1])
和(((B)tab[0]).analyzer(tab[1])
)在功能上是等价的,即使B
为analyzer
提供了自己的定义(这个概念称为多态性)。您使用的是什么语言?Java(不是Java脚本)这是一个完整的例子吗?因为显然,选项卡[2]
是未初始化的。无论如何,对象
没有方法分析
,所以您将对象强制转换为类“A”或“B”。拥有数组“A”将删除此要求(除非方法声明为最终
)。