G’day人, 通过提出这样一个天真的问题,我感到很尴尬.但我无法理解一件事, 我有这样的继承结构, B扩展A,我写的代码如下, A级 public class A{ private int pos = 0; public A(){ this.pos = 12; } public i
通过提出这样一个天真的问题,我感到很尴尬.但我无法理解一件事,
我有这样的继承结构,
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; } }
我还有一个课程要测试,这会让我们回答我的问题.
班级考试
import java.util.*; public class Test{ public static void main(String[] args){ B a = new B(); ArrayList<A> c = new ArrayList<A>(); 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?
除了 @Matt Ball和 @Hovercraft Full Of Eels提供的答案之外,您还可以避免通过将子类实现的方法声明为超类中的抽象方法来显式强制转换.Note : My basic understanding of inheritance is parent cannot access
child’s method except they are protected. But Child can access their
parent class’s method.
public abstract class A{ . . public abstract int getSpec(); }
编辑-
如@Kublai Khan所述,有必要使超类成为一个抽象类.