public class Test
{
public static void main(String args[])
{
A a = new B(); // object of type B
}
}
此处对象属于Class B类型,但由Class A
类型的变量引用执行A a = new A()
和A a = new B()
只允许我访问A类的成员和方法,那么为什么我要用B类的构造函数实例化变量a?
这在内存中的确切表现如何以及究竟发生了什么?
答案 0 :(得分:-1)
将变量声明为祖先类型允许您动态切换实现。例如......
public static void main(String[] args) {
List<String> stringList;
stringList = new ArrayList<>();
// Stuff Happens and now I need a LinkedList...
stringList = new LinkedList<>();
}
如果我从一开始就将stringList声明为ArrayList,我就无法将其切换为使用LinkedList。
至于它在内存中的表现。我有限的理解是编译器会关注TypeSafety的声明类,但运行时和内存只关心实例化类。