我们都知道,阳光是看得见却摸不着的。它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量。这注定我们只能利用光子而不能将其捕获(或许只是暂时)。在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. mybatis源码配置文件解析之五:解析mappers标签

    在上篇博客中分析了plugins标签,<mybatis源码配置文件解析之四:解析plugins标签>,了解了其使用方式及背后的原理.现在来分析<mappers>标签. 一.概述 ...

  2. 去除List集合中的重复值(四种好用的方法)(基本数据类型可用)

    最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合. 但是赋给set集合后,由于se ...

  3. 在 Spring Boot 中,如何干掉 if else!

    需求 传统实现 策略模式实现 ClassScanner:扫描工具类源码 总结 需求 这里虚拟一个业务需求,让大家容易理解.假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理. 订单实 ...

  4. Spring笔记(3) - debug源码AOP原理解析

    案例 @EnableAspectJAutoProxy//开启基于注解的aop模式 @Configuration public class AOPConfig { //业务逻辑类加入容器中 @Bean ...

  5. mongodb安装与mongo vue的使用

    首先,下载mongodb,然后安装 http://downloads.mongodb.com/win32/mongodb-win32-x86_64-enterprise-windows-64-2.6. ...

  6. linux系统配置常用命令top

    本人测试系统:centos7 命令名称:top Linux top命令用于实时显示 process 的动态. 参数:-b 批处理 -c 显示完整的治命令 -I 忽略失效过程 -s 保密模式 -S 累积 ...

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

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

  8. day47 作业

    表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('ma ...

  9. 从0开始,手把手教你使用React开发答题App

    项目演示地址 项目演示地址 项目源码 项目源码 其他版本教程 Vue版本 小程序版本 项目代码结构 前言 React 框架的优雅不言而喻,组件化的编程思想使得React框架开发的项目代码简洁,易懂,但 ...

  10. Django框架04 /模板相关、别名/反向解析/路由分发

    Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...