首页 > 解决方案 > 将一种对象类型分配给另一种对象类型时,Java 变量如何工作?

问题描述

我不确定如何立即解释我的疑问,所以我将从一个例子开始。我有下一行:

Object myObject = null;
Integer myInteger = 10;

myObject = myInteger;

基本上,我知道我可以将一个子类对象分配给一个超类对象(在这种情况下,类型为myInteger的类型IntegermyObjectObject)。到目前为止一切顺利,但现在......假设我想获得myObject的类。

System.out.println("myObject: " + myObject.getClass());

它打印这个:

myObject: class java.lang.Integer 

它说是类型Integer

我知道一个变量实际上存储了对内存中实际对象的引用,因此该方法getClass()返回实际对象的类。但是之后...

  1. 为什么我Integer不能通过myObject访问类的方法,因为它指向一个类型的对象Integer?我的意思是,为什么我不能做这样的事情?myObject.intValue();

  2. 如果我只能Object通过myObject访问方法(即使它指向 type 的对象Integer),Java 怎么知道可以通过myObject调用哪些方法?变量本身存储一种类型的类?

基本上,我想知道Java在变量中存储了哪些信息,它只是一个参考吗?或者它也有一个类名?如果变量已经分配了对子类对象的引用,它如何知道可以调用哪些方法?

我希望我的疑问很清楚,请原谅我的语法。

标签: javaobjectvariablesreferenceassign

解决方案


你的问题的答案基本上归结为两个关键点:“编译器不会让你做危险的事情”和“编译器没有你想象的那么聪明”。

为什么我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


推荐阅读