基本上标题是什么,但一些细节.我有一个带有几个SubClasses的SuperClass.我需要一个ArrayList来保存两种类型的子类,因此需要类型为SuperClass的ArrayList.我尝试getQuantity()
使用ArrayList.get(0).getQuantity();
(假设索引0的类型为SubClass1)访问Subclass1的方法.我收到错误:类型SuperClass的getQuantity未定义.
放入SuperClass ArrayList时,SubClass对象是否不保留其属性?如果他们确实保留了他们的属性,我该如何访问它们?
对象本身仍然是一个subclass
,但是当你把它们从集合中拿出来时它只知道superclass
它不能告诉你哪个是哪个,它必须选择共同点.
如果您确切知道特定索引包含类型的对象,则Subclass
可以将其强制转换:
Subclass myObject = (Subclass) list.get(0); System.out.println(myObject.getQuantity());
它应该工作.
更安全的方法需要测试对象是否真的如你所想:
SuperClass myObject = list.get(0); if ( myObject instanceof Subclass) { Subclass mySubObject = (Subclass) myObject; System.out.println(mySubObject.getQuantity()); }
如果对象不是类型Subclass
,第一个示例引发异常,第二个示例因为它之前测试以确认不会引发异常.
你需要理解的是,这SuperClass myObject = list.get(0)
不是对象本身,而是访问内存中对象的引用.把它想象成一个允许你控制你的对象的遥控器,在这种情况下,它不是一个功能齐全的遥控器,因为它没有显示你所有的对象都可以做到,所以你可以切换到更好的一个(如Subclass myObject = (Subclass) list.get(0)
)能够访问所有功能.
我肯定会推荐Head First Java书籍,因为它非常详细地介绍了这些内容(我从那里偷走了这个远程示例).