我正在阅读一个程序并看到以下语法:
Pet pet1 = (Pet) objIn.readObject();
Pet
是一个抽象类,objIn.readObjet()
表示从文件中读取对象,
但语法(Pet)
是什么意思?
是否将从文件中读取的每个对象设置为新的Pet
对象?但Pet
是一个抽象类,如何在其中设置对象?
答案 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)
这意味着您可以将对象视为其超类(之一)。在Java中,每个类都来自类Object
(除了原始类型之外,它们都具有相应的引用类型,无论如何)。这意味着我可以将String
,ArrayList
,Calendar
,SimpleDateFormat
或您可以想到的任何其他类投射到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
类中定义的任何其他方法都无法使用。