黑马程序员技术交流社区

标题: 一个细节 [打印本页]

作者: 邵阳    时间: 2012-8-20 18:48
标题: 一个细节
本帖最后由 邵阳 于 2012-8-21 07:46 编辑

import java.io.*;
class Demo
{
        public static void main(String[] args)throws Exception
        {
                method_2();
        }
        public static void method_1()throws IOException
        {
                ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("haha.txt"));
                oos.writeObject(new Person("张三",23));
                oos.close();
        }
        public static void method_2()throws Exception
        {
                ObjectInputStream ois=new ObjectInputStream(new FileInputStream("haha.txt"));
                Person p=(Person)ois.readObject();
                System.out.println(p);
                ois.close();
        }
}
class  Person implements Serializable
{
        public static final long serialVersionUID = 42L;
        private String name;
        int age;//不想通过静态非序列化,可以通过一个关键字实现。transient
         static String country="cn";
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
                //this.country=country;
        }
        public  String toString()
        {
                return name+"...."+age+"...."+country;
        }
}
结果

D:\java\zuoye\ceshi5>javac ceshi.java

D:\java\zuoye\ceshi5>java Demo          这里先生成haha。txt,用的是method_1

D:\java\zuoye\ceshi5>javac ceshi.java

D:\java\zuoye\ceshi5>java Demo          这里加上static得结果  cn
张三....23....cn

D:\java\zuoye\ceshi5>javac ceshi.java

D:\java\zuoye\ceshi5>java Demo               这里不加上static得结果  怎么不是cn,而是null啊
张三....23....null
作者: 唐杨老师    时间: 2012-8-20 19:10
D:\java\zuoye\ceshi5>javac ceshi.java
D:\java\zuoye\ceshi5>java Demo          这里加上static得结果  cn
张三....23....cn

D:\java\zuoye\ceshi5>javac ceshi.java
D:\java\zuoye\ceshi5>java Demo               这里加上static得结果  怎么不是cn,而是null啊
张三....23....null

这两个你分别用的哪个方法?问题说清楚....
作者: 杨鹏鹏    时间: 2012-8-20 19:21
在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。
作者: 邵阳    时间: 2012-8-21 07:45
本帖最后由 邵阳 于 2012-8-21 07:46 编辑

没人答吗?
2楼答非所问。完全死板
作者: 黑马-郑鹏    时间: 2012-8-21 09:33
当你没加static关键字时:  
public static void method_1()throws IOException
         {
                 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("haha.txt"));
                 oos.writeObject(new Person("张三",23));//这里你new的一个对象没有对country进行赋值,而country时String类型,所以它的默认值是null

                 oos.close();
         }
所以在你的文件haha中保存的属性就类似这样,name=张三,age=23,country=null
public static void method_2()throws Exception
         {
                 ObjectInputStream ois=new ObjectInputStream(new FileInputStream("haha.txt"));
                 Person p=(Person)ois.readObject();//这时p对象中name=张三,age=23,country=null
                 System.out.println(p);
                 ois.close();
         }
所以打印出来的结果是张三....23....null


而当你加上static关键字时,在类创建完以后,country的值即为cn
然后
public static void method_1()throws IOException
         {
                 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("haha.txt"));
                 oos.writeObject(new Person("张三",23));//这里你new的一个对象虽然没有对country进行赋值,但country是静态的,所以此时它的值是cn

                 oos.close();
         }
所以在你的文件haha中保存的属性就类似这样,name=张三,age=23,country=cn

public static void method_2()throws Exception
         {
                 ObjectInputStream ois=new ObjectInputStream(new FileInputStream("haha.txt"));
                 Person p=(Person)ois.readObject();//这时p对象中name=张三,age=23,country=cn
                 System.out.println(p);
                 ois.close();
         }
所以打印出来的结果是张三....23....cn
作者: 黑马-郑鹏    时间: 2012-8-21 10:10
对不起,对上面的回答做些改正.
你应该是在生成haha文件时,加上了static关键字,所以在你保存的那个文件中,只有name=张三和age=23的值。
然后当你调用method_2时,
如果你加static,则country由类创建,对象p中的name和age得到文件中的值,你用语句  return name+"...."+age+"...."+country;时,name和age是对象中的值,而country是类中的静态值,所以结果为:张三....23....cn
如果没加static时,country,name和age都时在创建对象时生成的,同时name和age获取文件中的值,得到name=张三,age=23,而country文件中没有值,所以用默认值null
从而得到的结果是:张三....23....null
下面的图片是我在生成haha文件时加了static时的内容:

其中只保存了name和age的值

而当你在生成haha文件时没加static,则文件中保存了name、age和country的值
下面的图片是我在生成haha文件时没加static时的内容:
http://bbs.itheima.com/forum.php?mod=attachment&aid=NjQyMHwyMGU4MTJiN2RkOGE3MzkyMjA2N2FiNjZiMzQ4MzYwMHwxNzM2NTgzNzg1&request=yes&_f=.jpg
这样,你在用method_2时,无论你加不加static,打印的结果都是:
张三....23....cn

6.jpg (9.05 KB, 下载次数: 76)

6.jpg





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