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

时间:2014-04-23 07:29:52

标签: java syntax casting

我正在阅读一个程序并看到以下语法:

Pet pet1 = (Pet) objIn.readObject();

Pet是一个抽象类,objIn.readObjet()表示从文件中读取对象, 但语法(Pet)是什么意思?

是否将从文件中读取的每个对象设置为新的Pet对象?但Pet是一个抽象类,如何在其中设置对象?

3 个答案:

答案 0 :(得分:4)

objIn.readObject();

返回类型Object的引用。您不能将类型为Object的引用分配给声明为类型Pet的引用。所以你使用这种语法 cast 它。铸造正在改变某种东西的类型。在这种情况下,指向现有Object

的指针

实施例

Object obj = objIn.readObject();

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

(Pet)告诉编译器现在将此实例称为Pet的类型。

修改

我自己也不能把它变得更好,所以Andrzej的评论可以在这里:

  

Casting只告诉类型检查器你(程序员)有更多关于对象真实类型的信息,而不是静态类型推断。例如,在这个例子中,readObject只能保证返回一个Object - 但我们可以从上下文中看出返回的值实际上实际上是Pet的一个实例。

答案 1 :(得分:0)

这是一个类型演员。 Read thisthis

这意味着您可以将对象视为其超类(之一)。在Java中,每个类都来自类Object(除了原始类型之外,它们都具有相应的引用类型,无论如何)。这意味着我可以将StringArrayListCalendarSimpleDateFormat或您可以想到的任何其他类投射到Object

答案 2 :(得分:0)

  

Pet是一个抽象类,如何在其中设置对象?

这与polymorphism有关。在面向对象的语言中,例如Java,可以进行如下变量声明:

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

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

如果Pet是抽象的,那么实际上并不重要。我们只是将someDog的引用存储在一个变量&#34; shape&#34;比如Pet

我们可以在Pet变量上调用pet中定义的所有方法,但Dog类中定义的任何其他方法都无法使用。