黑马程序员技术交流社区

标题: 自学遇到的问题,哪位大神来解决一下? [打印本页]

作者: yingsun    时间: 2014-9-12 15:36
标题: 自学遇到的问题,哪位大神来解决一下?
import java.io.*;
public class ObjectStreamDemo {
public static void main(String[] args)throws Exception
        {
                writeObj();
                readObj();
        }
        public static void readObj() throws Exception
        {
                ObjectInputStream ois=new ObjectInputStream(new FileInputStream("obj.txt"));
                Person p=(Person)ois.readObject();
                System.out.println(p);
                ois.close();
               
        }
        public static void writeObj() throws IOException
        {
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
                oos.writeObject(new Person("lisi0",399,"kr"));
                oos.close();
        }

}

import java.io.*;

public class Person implements Serializable{
public static final long serialVersionUID = 42L;
static String country="cn";
        transient private int age;
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        private String name;
        Person(String name,int age,String country)
        {
                this.name=name;
                this.age=age;
                this.country=country;
        }
        public String toString()
        {
                return name+":"+age+":"+country;
        }
       
}

上面的代码,如果writeObj();方法和readObj();方法一起执行,则结果输出lisi0:0:kr;两个方法分开执行则会输出lisi0:0:cn。

这是为什么?
               
作者: 陈琪    时间: 2014-9-12 15:52
看起来好厉害的样子
作者: 这个夏天的芬芳    时间: 2014-9-12 20:58
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: Virgilrd    时间: 2014-9-12 23:50
召唤高手……虽然你的问题我没看懂,语文渣
作者: 天邃任我桓    时间: 2014-9-13 00:08
还没学到IO
作者: ssy1939    时间: 2014-9-14 19:17
语法结构都错了    1、name的声明都到方法的下面,不想你是怎么执行的   2、country 都设为静态了,后面又用构造函数初始化country,那静态有什么意义
作者: yingsun    时间: 2014-9-14 23:50
Virgilrd 发表于 2014-9-12 23:50
召唤高手……虽然你的问题我没看懂,语文渣

可能是我的语文渣,没说明白。:L
作者: yingsun    时间: 2014-9-15 00:27
本帖最后由 yingsun 于 2014-9-15 00:33 编辑
ssy1939 发表于 2014-9-14 19:17
语法结构都错了    1、name的声明都到方法的下面,不想你是怎么执行的   2、country 都设为静态了,后面又 ...

说实话:这个原码是毕老师视频里的,他就是将country 都设为静态的。
主要是想表明:被操作的对象需要实现Serializable接口进行序列化才能进行对象的永久化存储,而静态数据(方法区里面的)是不能被序列化的(只能把堆里面的数据序列化,却不能把方法区的数据序列化),所以static修饰的数据就不应该改变。       毕老师演示的时候是将写入和读取两个方法分开执行的(就是先执行writeObj()方法,再注释掉writeObj(),执行readObj()方法),静态方法区的数据没有被修改(也就是country的值是“cn”)。但是我偶然的没有把writeObj()注释掉,结果是不能被序列化的静态数据被改掉了(变成了后传入的“kr”)。所以觉得很奇怪。。。

作者: yingsun    时间: 2014-9-15 00:34
陈琪 发表于 2014-9-12 15:52
看起来好厉害的样子

:L我是菜鸟。。。
作者: yingsun    时间: 2014-9-15 00:36
这个夏天的芬芳 发表于 2014-9-12 20:58

神马意思?也没看懂?
作者: WakeUp    时间: 2014-9-15 02:12
我觉得应该是这样的,Person类在加载后country的值是cn,在运行write方法后,new一个Person对象,name和age的值加载到堆内存中,country的值加载到方法区中,write方法结束后,堆内存释放,但方法区没有释放,这样在读取文件的时候,读取到的country值为kr


作者: 这个夏天的芬芳    时间: 2014-9-15 22:49
yingsun 发表于 2014-9-15 00:36
神马意思?也没看懂?

没学到~~
作者: 这个夏天的芬芳    时间: 2014-9-15 22:51
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: yingsun    时间: 2014-9-17 12:07
WakeUp 发表于 2014-9-15 02:12
我觉得应该是这样的,Person类在加载后country的值是cn,在运行write方法后,new一个Person对象,name和age ...

我也这么猜想来着。可能真是这样。谢谢你!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2