几个问题:
当我在阅读对象时进行投射....为什么我必须使用B o_b = (B) one;
,为什么不使用A o_b = (A) one
?对象类型为A
,我已将其保存在文件中。另外,我想确认当我们制作一个物体时
像这样A a = new B()
这行中的对象类型是什么?
此外,为什么不使用对象保存类?
为什么不保存静态变量(可序列化)?
代码:
import java.io.*;
class A {
public void go(int height){
}
}
public class B extends A implements Serializable{
int height;
public void go(int height){
this.height = height;
System.out.println("height is" + height);
}
public static void main(String[] args){
A a = new B();
a.go(43);
//Saving Object
try{
FileOutputStream f = new FileOutputStream("foo.ser");
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(a);
o.close();
// Reading an Object
FileInputStream filestream = new FileInputStream("foo.ser");
ObjectInputStream p = new ObjectIntputStream(filestream);
Object one = p.readObject();
//Casting
B o_b = (B) one;
p.close();
System.out.println("saved values were" + o_b.height);
} catch (Exception ex){
ex.printStackTrace();
}
}
}
答案 0 :(得分:0)
A a = new B()
的类型。变量a
的静态类型为A
,而动态类型为B
。因此,当您在代码中使用a
时,就好像它是A
类型一样,它在运行时指向类型为B
的对象。您可能想要了解多态性。这也解释了为什么您可以将反序列化的对象强制转换为B
,尽管您序列化了a
。实际序列化的对象是B
类型。您可以将a
的初始化更改为A a = new A()
,并且转换将在运行时失败。此外,您应该已经为未经检查的强制转换获取编译器警告,这基本上意味着无法确保投射在运行时成功。Class<A> classA = A.getClass()
,您将获得类A
的类对象,并且能够序列化它。我希望这能回答你的问题。请记住,并非所有可以完成的事情都应该完成。我会考虑序列化一个类对象坏设计。肯定有更好的方法来保存静态变量的内容。