A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-8-20 18:48  /  1481 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵阳 于 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

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
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

这两个你分别用的哪个方法?问题说清楚....
回复 使用道具 举报
在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 邵阳 于 2012-8-21 07:46 编辑

没人答吗?
2楼答非所问。完全死板
回复 使用道具 举报
当你没加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
回复 使用道具 举报
对不起,对上面的回答做些改正.
你应该是在生成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=NjQyMHw2MDY0MjliMTM0OTNlNGIwZmZmODhmNWQwYmU2YWMwZnwxNzM0OTU3MTE3&request=yes&_f=.jpg
这样,你在用method_2时,无论你加不加static,打印的结果都是:
张三....23....cn

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

6.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马