当前位置:首页 > 好文分享 > 正文

java面试题问些啥(说说Java中的transient关键字)

java面试题问些啥(说说Java中的transient关键字)

探索科学真理,探索各种事物。感受科学魅力,开启智慧生活!一年365天,每天和你一起学习新知识。上一篇文章《快速学习springboot》用springboot编...

探索科学真理,探索各种事物。感受科学魅力,开启智慧生活!一年365天,每天和你一起学习新知识。上一篇文章《快速学习springboot》用springboot编写单元测试《Java并发编程》谈Java中的内存模型JMM面试官:说说你知道多少线程池拒绝策略? 我在前言之前写过一篇关于序列化的文章,今天要讲的文件也是从transient开始和序列化有关的。但是,有相当一部分人不知道这个关键词,甚至不知道它的存在。 瞬态关键字介绍在Java中,当一个类实现java.io.Serializable接口时,表示该类可以序列化。我们可以序列化这个类的属性并在外部保存,或者用另一个jvm传输数据。但是,我们有没有想过,如果一个类包含了私有信息,比如用户的密码,那么这个属性就不能对外序列化?当然,我们可以在序列化之前手动将该值设置为null,但最优雅的方式是使用transient关键字。 在我们不想对外序列化的属性前加上transient关键字,属性就不会被序列化。 代码测试假设我们有如下的用户对象: @Datapublic类用户实现可序列化的{私有字符串用户名;私有临时字符串密码;} 通过序列化工具类进行序列化和反序列化: @ test public void test(){ User User=new User();user . set username(" happy Java ");user . set password(" 123456 ");System.out.println("序列化前:" user . tostring());byte[]serialize=serialization utils . serialize(user);user new user=serialization utils . deserialize(serialize);System.out.println("反序列化:" new user ");} 运行结果如下: 从结果中可以看出,反序列化后没有password字段,证明password没有参与序列化。这是transient关键字的用法。 静态属性的序列化问题可能读者会想,静态属性加了transient会怎么样?反序列化后这个类的静态属性编程为null吗?代码验证了以下内容: 向用户添加属性计数: 私有瞬态静态int计数; 这是一个静态属性。 首先将此属性设置为10,然后序列化和反序列化一个类,然后查看此静态属性: @ test public void test(){ User User=new User();user . set count(10);user . set username(" happy Java ");user . set password(" 123456 ");System.out.println("序列化前:" user . tostring());system . out . println(" user count : " user . getcount());byte[]serialize=serialization utils . serialize(user);user new user=serialization utils . deserialize(serialize);System.out.println("反序列化:" new user ");system . out . println(" user count : " user . getcount());} 输出结果如下: 从结果来看,静态属性没有变化。事实上,无论是否添加了transient关键字,静态属性都不会被序列化。 总结1)变量一旦被transient修改,就不再是对象持久化的一部分。 2)2)transient关键字只能修改变量,不能修改方法和类。 3)被transient关键字修改的变量不能再被序列化,一个静态变量无论是否被transient修改都不能被序列化。 弘扬百科知识,让更多人了解各个领域和相关的百科知识,让更多人了解生活中的技能。

发表评论

最新文章