ArrayList <SuperClass>中的SubClass对象是否保留SubClass独有的方法?

com*_*cis 2 java inheritance arraylist

基本上标题是什么,但一些细节.我有一个带有几个SubClasses的SuperClass.我需要一个ArrayList来保存两种类型的子类,因此需要类型为SuperClass的ArrayList.我尝试getQuantity()使用ArrayList.get(0).getQuantity();(假设索引0的类型为SubClass1)访问Subclass1的方法.我收到错误:类型SuperClass的getQuantity未定义.

放入SuperClass ArrayList时,SubClass对象是否不保留其属性?如果他们确实保留了他们的属性,我该如何访问它们?

Mau*_*res 5

对象本身仍然是一个subclass,但是当你把它们从集合中拿出来时它只知道superclass它不能告诉你哪个是哪个,它必须选择共同点.

如果您确切知道特定索引包含类型的对象,则Subclass可以将其强制转换:

Subclass myObject = (Subclass) list.get(0);
System.out.println(myObject.getQuantity());
Run Code Online (Sandbox Code Playgroud)

它应该工作.

更安全的方法需要测试对象是否真的如你所想:

SuperClass myObject = list.get(0);
if ( myObject instanceof Subclass) {
  Subclass mySubObject = (Subclass) myObject;
  System.out.println(mySubObject.getQuantity());
}
Run Code Online (Sandbox Code Playgroud)

如果对象不是类型Subclass,第一个示例引发异常,第二个示例因为它之前测试以确认不会引发异常.

你需要理解的是,这SuperClass myObject = list.get(0)不是对象本身,而是访问内存中对象的引用.把它想象成一个允许你控制你的对象的遥控器,在这种情况下,它不是一个功能齐全的遥控器,因为它没有显示你所有的对象都可以做到,所以你可以切换到更好的一个(如Subclass myObject = (Subclass) list.get(0))能够访问所有功能.

我肯定会推荐Head First Java书籍,因为它非常详细地介绍了这些内容(我从那里偷走了这个远程示例).

  • 这不是问题,那就是面向对象语言(和泛型)的工作原理,你不能说你的列表只包含`Subclass`,因为它没有,编译器**有**强制执行. (2认同)