【发布时间】:2021-10-06 22:24:38
【问题描述】:
设Dog为继承自Animal类的类,我们可以如下进行实例化:
Animal a = new Dog();
我知道在编译时,编译器只知道我们将a 声明为Animal,而在运行时,我们将a 指向Dog 对象。但在这一点上我有些模糊:
编译时类型Animal 是堆栈上变量a 的类型吗?还是只是在编译时告诉编译器a可以引用什么类型的对象,与栈上变量a的类型无关?
我问这个是因为我想知道关于编译时类型 Animal 的信息在运行时是否仍然存在,或者它是否会变得完全不相关并被丢弃?如果还存在,是否作为变量a的类型存储在栈上?如果是这样,当我们引用a的类型时,程序怎么知道我们引用的是a引用的对象的类型,还是栈上变量a的类型?
我是这个概念的新手,可能会有一些误解。谁能为我澄清一下?提前致谢!
【问题讨论】:
-
您可以通过
a.GetType()尝试检查对象的运行时类型 -
对于局部变量,我不确定。但是对于字段,编译时类型肯定是在运行时保留的。你可以通过反射得到它。
-
@Fabio 谢谢你的评论 :) 所以我可以问一下堆栈上的变量
a(不是它在堆上引用的对象)在运行时的类型是Dog? -
@J-A-S 你为什么在乎?知道这些信息对您有何帮助?
-
"程序怎么知道我们引用的是
a引用的对象的类型,还是栈上变量a的类型?"这取决于您在谈论什么代码。例如,虚方法调用将使用运行时对象类型,而方法重载解析将使用编译时类型。或者换一种说法:你实际上并没有正确定义问题。你所说的“变量”是什么意思,你是指被引用的对象,还是做你的意思是对象引用本身?