我们都知道,阳光是看得见却摸不着的。它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量。这注定我们只能利用光子而不能将其捕获(或许只是暂时)。在Java中,有一种变量就像光子一样,我们可以利用它完成业务逻辑,但是却无法将其序列化保存在磁盘中(就像光子无法放在罐子里)。这种被transient关键字修饰的变量我们称之为瞬态变量。

一、Transient的作用:

  在Java中,只要一个对象实现了Serilizable接口,该类的所有属性和方法都将会自动序列化,使用起来非常方便。

但是有时我们在使用序列化的时候,只需要类中的一部分序列化,而另一部分则不序列化,比如用户的银行卡信息等,这些信息我们不希望在网络操作中被传输,为了安全起见,我们就可以给它们加上transient关键字,成为瞬态变量。这样一来,这些字段的生命周期就只存在于调用者的内存中,而不会在磁盘中持久化

class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L; private String username;
private transient String passwd;//瞬态变量,序列化的时候会被忽略掉 public String getUsername() {return username; }
public void setUsername(String username) {this.username = username;}
public String getPasswd() {return passwd; }
public void setPasswd(String passwd) {this.passwd = passwd; }
}

二、Transient使用总结

  • 变量被transient修饰则不再是对象持久化的一部分,该变量内容在序列化之后将无法访问(获得)。
  • Transient只能修饰变量,不能修饰方法和类。本地变量不能被transient来修饰,自定义类需要实现Serializable接口(不能是Externalizable接口)。
  • 被transient修饰的变量将不能序列化,被static关键字修饰的静态变量无论是否有transient,都不能被序列化(即静态变量不能序列化)。
  • Transient并不是一种很好的局部序列化的方式,因为在使用它之后,被transient修饰的变量返回的都是默认值,这很容易在程序中引发我们意想不到的结果(比如等值判断或是数据库写入操作等),因此并不推荐使用transient瞬态变量。

三、注意

  虽然transient关键字用于声明瞬态变量,在序列化的时候不会被持久化到磁盘。但是能不能序列化被transient关键字修饰的变量,这是根据类实现的序列化接口决定的。例如:Serializable接口中,若没有强制指定序列化属性,则transient有效;若Serializable接口中指定了强制序列化的属性,则transient无效;而Externalizable接口本身就需要指定序列化的属性,所以transient在该接口中无效

Java瞬态变量transient的更多相关文章

  1. Java 中关键字transient引出序列化与反序列化

    一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...

  2. 关于Java中的transient关键字

    Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...

  3. java中变量命名和引用变量的一个坑

    这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西.第二个主题,就是讨论一下对象引用变量的一个注意点.

  4. java环境变量配置

    1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0 ...

  5. Ubuntu中配置Java环境变量时,出现command not found问题解决记录

    百度出Ubuntu中配置Java环境变量时,在利用sudo gedit /etc/profile 对profile编辑后, 在terminal中输入 sudo source /etc/profile, ...

  6. JAVA基础学习——1.3 关于JAVA环境变量设定 Path,Java_Home,ClassPath

    在安装完JDK以后,要设定JAVA环境变量. 刚接触的时候,我很困惑,这特么什么玩意啊,然后知其然不知其所以然的 按照说明做完了却不知道为什么这么做,这里简单做一些总结说明. 首先,什么是环境变量 环 ...

  7. Java环境变量的简记

    1,安装版的jre或jdk.安装后如果不做开发用,则只是做Java运行时环境,则不需要手动配置任何Java环境变量. 2,绿色解压版(拷贝版)jdk或jre.运行和开发都需要配置环境变量. 运行Jav ...

  8. Java环境变量

    很简单的问题!配置Java环境变量 准备 下载安装Java,官方地址 打开系统环境变量,我的电脑右键 JAVA_HOME 添加JAVA_HOME,设置jdk安装目录,比如"C:\Progra ...

  9. mac java环境变量设置

    Mac下添加java环境变量 方法一:全局配置   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #临时提权   sudo su   #输入密码   vi /et ...

随机推荐

  1. html+css快速入门教程(1)

    1 HTML简介 1.1. 什么是HTML?(了解) HTML是超文本标记语言(HyperText Markup Language,HTML)的缩写.是标准通用标记语言(SGML Standard G ...

  2. 51单片机入门(补充)1--与C语言的交接

    我写完上一个文章,发现我写的还是不够全面,所以,这篇文章将会延续上一个文章的内容,并且再次补充新的东西,如果还有什么地方需要补充,还请各位一一指出,如果你已经学过这些东西,大可以直接跳过,假如说之后有 ...

  3. 第五天.权限批量录入/更新、信号、Django日志配置

    1. 角色.菜单.权限的增删该查 1. ModelForm增删改查 2. 增加和编辑使用同一个视图函数 Form() 1. 生成获取用户输入的标签 2. 对用户输入的内容做校验 3. 保留输入的内容同 ...

  4. html5中二进制对象Blob的使用——Blob与ArrayBuffer、TypeArray和String的相互转换

    在网页开发中遇到这样一个问题,在使用select的时候,想让里面的文字水平居中.首先想到的是text-align:center;但是发现在Chrome浏览器下不兼容,需要使用到text-align-l ...

  5. Vue-base64移动端PDF展示

    作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多:做一个移动端PDF预览的功能,本来可以通过window.open(),打开的,但是没办法,做后台的小伙伴,传给前端的数据是ba ...

  6. 6.29模拟赛 (T1:李时珍的皮肤衣 T2:马大嘴的废话 T3:SSY的队列 T4:清理牛棚);

    啊,又是考炸的一天,成功的退步了三名,啊,成共的看错了T1  的题意 ,水了80分. 第十五名就是我,额,已经有点倒数的感觉了,并且一道题都没AC  我太难了. 好了,废话不多说了,下面正式提接: 这 ...

  7. Zip破解工具Fcrackzip使用简介

    0x00 fcrackzip简单介绍 fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便.破解速度快,能使用字典和指定字符集破解,适用于linux.mac osx 系统 0x0 ...

  8. Mysql 常用语句实战(2)

    前置 sql 语句 用来创建表.插入数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- ...

  9. 博弈论 | 详解搞定组合博弈问题的SG函数

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天这篇是算法与数据结构专题的第27篇文章,我们继续深入博弈论问题.今天我们要介绍博弈论当中非常重要的一个定理和函数,通过它我们可以解决许多 ...

  10. python读取EXCEL是去掉空白行和表头全部重命名

    当读取进来的表格如图所示,转换成图2. import pandas as pd # header:指定作为列名的行,默认0,即取第一行的值为列名.数据为列名行以下的数据:若数据不含列名, # 则设定 ...