天真的inheritance问题 – Java
G’day人,
问这样一个天真的问题让我感到尴尬。 但我无法理解一件事,我有这样的inheritance结构,
B扩展A,我写的代码如下,
A级
public class A{ private int pos = 0; public A(){ this.pos = 12; } public int getPos(){ return this.pos; } }
B级
public class B extends A{ int spec = 15; public B(){ super(); } public int getSpec(){ return this.spec; } }
我还有一个课程要测试,这会让我们回答我的问题。
class级考试
import java.util.*; public class Test{ public static void main(String[] args){ B a = new B(); ArrayList c = new ArrayList(); c.add(a); System.out.println(c.get(0).getPos()); System.out.println(c.get(0).getSpec()); } }
问:现在我正在创建一个B实例,这意味着我可以访问我父类的方法getPos()
和B自己的方法getSpec()
。 但是如果我创建一个类型为A的ArrayList(… B也是类型A,因为它扩展了A …)并添加了我的B实例,它就失去了访问它自己的方法的能力。 我究竟做错了什么? ArrayList实现是否在内部将我的B转换为A?
注意:我对inheritance的基本理解是父级不能访问子级方法,除非它们受到保护。 但Child可以访问其父类的方法。
除了@Matt Ball和@Hovercraft Full Of Eels提供的答案之外,您还可以通过将子类实现的方法声明为超 类中的抽象方法来避免显式 强制转换 。
public abstract class A{ . . public abstract int getSpec(); }
编辑-
正如@Kublai Khan所提到的,有必要让超类成为一个抽象类。
没有涉及铸造。 你正在做的事情与此无异:
A bAsA = new B():
虽然bAsA引用的对象确实是B对象,但它由A变量保存,因此只有A方法可用(除非您明确地将其转换为B变量)。
由于您的ArrayList是A的ArrayList,因此ArrayList中的每个项都被视为A变量,并且只有A方法可用。