关于类型转换和继承的几个java问题
您好,我有一些关于类型转换和继承的问题。我一直在读一些书,我理解类型转换的要点和基础。然而,我并不完全理解我在哪里可以使用它,也不能使用它 以这一类为例:关于类型转换和继承的几个java问题,java,inheritance,casting,Java,Inheritance,Casting,您好,我有一些关于类型转换和继承的问题。我一直在读一些书,我理解类型转换的要点和基础。然而,我并不完全理解我在哪里可以使用它,也不能使用它 以这一类为例: class A{ public A(){} } A temp = new A(); temp = (Object)temp; 这段代码告诉我错误“无法从类型对象转换为类型A”。然而,这不是从类型A转换为类型对象吗?你能不能不按顺序输入 现在我的第二个问题是关于继承之类的 键入时: Object
class A{
public A(){}
}
A temp = new A();
temp = (Object)temp;
这段代码告诉我错误“无法从类型对象转换为类型A”。然而,这不是从类型A转换为类型对象吗?你能不能不按顺序输入
现在我的第二个问题是关于继承之类的
键入时:
Object temp = new A();
到底发生了什么?temp是A还是对象 以下是摘录自:
如果为任何其他
类没有extends子句,则
类将类对象
作为其
隐式直接超类
当然,对象本身有点特殊():
除对象
外的每个类都是
的扩展(即的子类)
单一现有类别(§8.1.3)和
可实施接口(§8.1.4)
每个类都是对象
的后代
在本例中,您正在尝试将A
的对象存储到名为A
的类对象中。这是行不通的。您需要执行以下操作:
objecttestobject=(Object)temp代码>
这将对象
存储到testObject
中,该对象的类型为您强制转换到的对象
给你
“无法从类型对象转换为类型A”。然而,这不是从类型A转换为类型对象吗?你能不能不按顺序输入
你说得对
(Object)temp;
正在将temp
转换为对象,该对象是A
。然而,这并不是编译器所抱怨的。现在你已经,有效地
A a = anObjectNOTAnA
(A=…
是无效代码。我已将其更改为A=…
)
这意味着您无法将对象
转换回对象
,除非您明确地强制转换它并可能抑制未选中强制转换警告:
A a = (A)anObjectNOTAnA
或
关于你的另一个问题:
Object temp = new A();
到底发生了什么?temp是A还是对象
当您强制转换任何类型的对象时,它不会更改基础对象的实际类型。new A()
始终是A
,无论其
A a = new A();
或
或
如果A
存储在对象中
,则它只是同一对象的不同“视图”。但是,要使用A
特定功能,必须首先将其恢复到A
视图:
objButReallyA.getAOnlyField(); //compile error
((A)objButReallyA).getAOnlyField(); //Okay
这只是因为不能将超类对象指定给子类引用
所以你不能这样做:
temp = (Object)temp;
因为它与:
Object newObject = new Object();
A temp = newObject;
您将在这里得到相同的编译错误
当然,你可以这样做:
Object newObject = new Object;
A temp = new A();
newObject = temp;
之所以可以这样做,是因为可以将子类指定给超类引用问题在最后一行。首先,通过以下语句向Java保证temp为Object类型:
(Object) temp
之后,您尝试将一个编译器认为是object类型的对象分配给一个应该是a类型的变量。因此,总而言之,将temp强制转换为object类型的部分是好的,问题是当您之后尝试将其分配给一个预期是a类型的变量时
对于第二个问题,temp是A。当使用new关键字创建对象时,对象的类型将始终是紧跟其后的任何类型。在案例A中,随后将temp分配给Object类型的变量,但这不会改变temp的实际类型。有一个X类型的变量只会告诉你该变量指向的是X的一个子类型。@fge是吗?它只是一个空的构造函数,我错了。。。但是代码>是redundant@appman0724它是A
。您将使用A
@fge的实例变量和方法哦,是的;没有必要thanks@mangusta为什么它要我在使用A的实例方法之前将其强制转换为类型A?
temp = (Object)temp;
Object newObject = new Object();
A temp = newObject;
Object newObject = new Object;
A temp = new A();
newObject = temp;
(Object) temp