java - 将一种对象类型分配给另一种对象类型时,Java 变量如何工作?
问题描述
我不确定如何立即解释我的疑问,所以我将从一个例子开始。我有下一行:
Object myObject = null;
Integer myInteger = 10;
myObject = myInteger;
基本上,我知道我可以将一个子类对象分配给一个超类对象(在这种情况下,类型为myInteger的类型Integer
为myObjectObject
)。到目前为止一切顺利,但现在......假设我想获得myObject的类。
System.out.println("myObject: " + myObject.getClass());
它打印这个:
myObject: class java.lang.Integer
它说是类型Integer
!
我知道一个变量实际上存储了对内存中实际对象的引用,因此该方法getClass()
返回实际对象的类。但是之后...
为什么我
Integer
不能通过myObject访问类的方法,因为它指向一个类型的对象Integer
?我的意思是,为什么我不能做这样的事情?myObject.intValue();
如果我只能
Object
通过myObject访问方法(即使它指向 type 的对象Integer
),Java 怎么知道可以通过myObject调用哪些方法?变量本身存储一种类型的类?
基本上,我想知道Java在变量中存储了哪些信息,它只是一个参考吗?或者它也有一个类名?如果变量已经分配了对子类对象的引用,它如何知道可以调用哪些方法?
我希望我的疑问很清楚,请原谅我的语法。
解决方案
你的问题的答案基本上归结为两个关键点:“编译器不会让你做危险的事情”和“编译器没有你想象的那么聪明”。
为什么我
Integer
不能通过myObject
指向一个类型的对象来访问类的方法Integer
?
你知道,因为你看到那行myObject = myInteger;
,所以你知道那myObject
会有一个intValue()
方法。
当编译器看到你调用myObject.intValue();
时,它不会返回几行(就像你做的那样)来找出实际引用的内容myObject
。它只是看到它的类型是Object
,并允许您仅使用Object
. 由于它不回顾myObject
实际引用的内容,因此就编译器而言,myObject
它可以引用 an Integer
,但它也可以引用 a String
,因为您可以这样做:
myObject = "Hello";
String
没有intValue()
方法。“比抱歉更安全”,编译器说,并且不允许您调用intValue
. 您可以通过强制转换告诉编译器您更了解:
((Integer)myObject).intValue();
Java如何知道可以通过哪些方法调用
myObject
?
这是由表达式的类型决定的。表达式myObject
是类型Object
,因为变量myObject
是类型Object
。另一方面,表达式((Integer)myObject)
的类型是Integer
。
推荐阅读
- c# - 我正在运行一个 Web 应用程序并想使用 C# 代码更新我的 SQL Server 用户配置文件数据库,但无论我做什么,我都无法让它工作
- javascript - 移除不同索引处的数组元素
- python - 在 Python 中编写类型函数
- ruby-on-rails - 传递参数行为 - 在验证失败/刷新时丢失参数
- azure - 你可以通过 ssh 进入一个 azure sphere MT-3620 吗?
- python - SQL与python连接
- javascript - 使用单选按钮选择不同的值
- sql-server - Count Like Description 列和基于设备的总和
- java - 如何在主要方法中用流利的句子打印我创建的方法的结果?
- php - 防止直接访问 PHP 表单处理程序