Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于类型转换和继承的几个java问题_Java_Inheritance_Casting - Fatal编程技术网

关于类型转换和继承的几个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