括号中的类型名是什么意思?

kadbb459  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(369)

我正在读一个程序,看到了以下语法:

Pet pet1 = (Pet) objIn.readObject();
``` `Pet` 是一个抽象类, `objIn.readObjet()` 意思是从文件中读取对象,但是语法是什么 `(Pet)` 什么意思?
它是否将从文件中读取的每个对象都设置为新对象 `Pet` 反对?但是 `Pet` 是抽象类,如何在其中设置对象?
rekjcdws

rekjcdws1#

objIn.readObject();

返回类型为的引用 Object . 不能指定类型为的引用 Object ,指向声明为类型的引用 Pet . 所以你用这个语法来转换它。铸造就是改变某种东西的类型。在本例中,指向现有 Object .

示例

Object obj = objIn.readObject();

if(obj instanceof Pet) {
    // Make sure it is of type Pet
    Pet pet1 = (Pet)obj;
}

这个 (Pet) 告诉编译器现在将此示例引用为 Pet .

编辑

我自己说得再好不过了,所以andrzej的评论可以放在这里:
强制转换只告诉类型检查器您(程序员)有更多关于对象真实类型的信息,而不是从静态类型中推断出来的信息。例如,在本例中,readobject只保证返回一个对象,但是我们可以从上下文中看出,返回的值实际上是pet的一个示例。

93ze6v8z

93ze6v8z2#

这是一种类型转换。读这个或这个。
这意味着您可以将对象视为它们的超类之一。在java中,每个类都是从类派生的 Object (除了基元类型之外,所有的基元类型都有相应的引用类型)。这意味着我可以 String , ArrayList , Calendar , SimpleDateFormat 或者你能想到的其他课程 Object .

kxkpmulp

kxkpmulp3#

但是 Pet 是抽象类,如何在其中设置对象?
这与多态性有关。在面向对象语言(如java)中,可以进行如下变量声明:

class Dog extends Pet {...}
Dog someDog = new Dog(...);

Pet pet = someDog; // <--- polymorphism in action

如果 Pet 是否抽象。我们只是存储对 someDog 在一个可变的“形状”像 Pet .
我们可以调用中定义的所有方法 Pet 在我们的 pet 变量,但在 Dog 不能上课了。

相关问题