黑马程序员技术交流社区
标题:
一个细节
[打印本页]
作者:
邵阳
时间:
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时的内容:
6.jpg
(9.28 KB, 下载次数: 79)
下载附件
2012-8-21 10:03 上传
其中只保存了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)
下载附件
2012-8-21 10:06 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2