Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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_Class_Inheritance - Fatal编程技术网

关于类的语法(Java)

关于类的语法(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的

我有一个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的方法)。我不明白它的意义(为什么在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”将删除此要求(除非方法声明为
最终
)。