我正在读一个程序,看到了以下语法:
Pet pet1 = (Pet) objIn.readObject(); ``` `Pet` 是一个抽象类, `objIn.readObjet()` 意思是从文件中读取对象,但是语法是什么 `(Pet)` 什么意思? 它是否将从文件中读取的每个对象都设置为新对象 `Pet` 反对?但是 `Pet` 是抽象类,如何在其中设置对象?
rekjcdws1#
objIn.readObject();
返回类型为的引用 Object . 不能指定类型为的引用 Object ,指向声明为类型的引用 Pet . 所以你用这个语法来转换它。铸造就是改变某种东西的类型。在本例中,指向现有 Object .
Object
Pet
示例
Object obj = objIn.readObject(); if(obj instanceof Pet) { // Make sure it is of type Pet Pet pet1 = (Pet)obj; }
这个 (Pet) 告诉编译器现在将此示例引用为 Pet .
(Pet)
编辑
我自己说得再好不过了,所以andrzej的评论可以放在这里:强制转换只告诉类型检查器您(程序员)有更多关于对象真实类型的信息,而不是从静态类型中推断出来的信息。例如,在本例中,readobject只保证返回一个对象,但是我们可以从上下文中看出,返回的值实际上是pet的一个示例。
93ze6v8z2#
这是一种类型转换。读这个或这个。这意味着您可以将对象视为它们的超类之一。在java中,每个类都是从类派生的 Object (除了基元类型之外,所有的基元类型都有相应的引用类型)。这意味着我可以 String , ArrayList , Calendar , SimpleDateFormat 或者你能想到的其他课程 Object .
String
ArrayList
Calendar
SimpleDateFormat
kxkpmulp3#
但是 Pet 是抽象类,如何在其中设置对象?这与多态性有关。在面向对象语言(如java)中,可以进行如下变量声明:
class Dog extends Pet {...} Dog someDog = new Dog(...); Pet pet = someDog; // <--- polymorphism in action
如果 Pet 是否抽象。我们只是存储对 someDog 在一个可变的“形状”像 Pet .我们可以调用中定义的所有方法 Pet 在我们的 pet 变量,但在 Dog 不能上课了。
someDog
pet
Dog
3条答案
按热度按时间rekjcdws1#
返回类型为的引用
Object
. 不能指定类型为的引用Object
,指向声明为类型的引用Pet
. 所以你用这个语法来转换它。铸造就是改变某种东西的类型。在本例中,指向现有Object
.示例
这个
(Pet)
告诉编译器现在将此示例引用为Pet
.编辑
我自己说得再好不过了,所以andrzej的评论可以放在这里:
强制转换只告诉类型检查器您(程序员)有更多关于对象真实类型的信息,而不是从静态类型中推断出来的信息。例如,在本例中,readobject只保证返回一个对象,但是我们可以从上下文中看出,返回的值实际上是pet的一个示例。
93ze6v8z2#
这是一种类型转换。读这个或这个。
这意味着您可以将对象视为它们的超类之一。在java中,每个类都是从类派生的
Object
(除了基元类型之外,所有的基元类型都有相应的引用类型)。这意味着我可以String
,ArrayList
,Calendar
,SimpleDateFormat
或者你能想到的其他课程Object
.kxkpmulp3#
但是
Pet
是抽象类,如何在其中设置对象?这与多态性有关。在面向对象语言(如java)中,可以进行如下变量声明:
如果
Pet
是否抽象。我们只是存储对someDog
在一个可变的“形状”像Pet
.我们可以调用中定义的所有方法
Pet
在我们的pet
变量,但在Dog
不能上课了。