我们都知道,阳光是看得见却摸不着的。它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量。这注定我们只能利用光子而不能将其捕获(或许只是暂时)。在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. day19__第三次作业

    一.break 与 continue 的区别 答:break 是结束全部循环,continue 是结束当前循环,开始进行下一循环 二.函数传递参数时,所用的内存地址一样吗? 答:一样 name = ' ...

  2. 【贪心】Emergency Evacuation

    题目 大致题意 把指定的人从同一出口送出车外,且同一位置不能同时有两个人,求所需的最短时间. 分析 第一感觉就是利用贪心思想解决问题,但是这道题的数据范围用模拟的话肯定是会爆掉的,所以这是不可取的.我 ...

  3. Redis系列(九):数据结构Hash源码解析和HSET、HGET命令

    2.源码解析 1.相关命令如下: {"hset",hsetCommand,,"wmF",,NULL,,,,,}, {"hsetnx",hse ...

  4. 收藏python开发各种资源官方文档

    http://json.cn/ https://cn.bing.com/ https://processon.com/ https://docs.djangoproject.com/en/1.11/r ...

  5. vue项目chunk包loading失败解决办法

    错误截图: 解决方法: // loading chunk 出错处理 router.onError((error) => { const pattern = /Loading chunk (\d) ...

  6. Tomcat Filter之动态注入

    前言 最近,看到好多不错的关于"无文件Webshell"的文章,对其中利用上下文动态的注入Filter的技术做了一下简单验证,写一下测试总结,不依赖任何框架,仅想学习一下tomca ...

  7. Docker可视化工具Portainer

    1 前言 从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的.无聊搜了一下,原来已经有很多Docker可视化工具了.如DockerUI.Shipyard.Rancher.Portai ...

  8. css如何设置不可点击?

    通过设置元素的pointer-events属性设置为none,来实现元素不可点击.此方法是通过设置元素的鼠标事件失效来实现元素不可点击. css设置不可点击: css代码: .disable { po ...

  9. JS断点调试,必备的javaScript的debug调试技巧

    1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断 ...

  10. Python爬虫教程(16行代码爬百度)

    最近在学习python,不过有一个正则表达式一直搞不懂,自己直接使用最笨的方法写出了一个百度爬虫,只有短短16行代码.首先安装必背包: pip3 install bs4 pip3 install re ...