Java关键字之static、final、transient
static关键字
static关键字,通常用来修饰变量和方法以及静态代码块。被修饰的变量表示为类所有对象所共有的,被修饰的方法表示类的方法。
掌握好static关键字很重要一点就是,static的作用域是类而非某个具体对象。
举例
静态属性和静态方法
/**
* @author xuyi
* @Time 2016年8月23日 下午9:28:39
* @类名 StaticDemo
* @功能描述:表示访问次数的类
* @春风十里不如你
* @备注:
*/
public class StaticDemo
{
// 表示访问次数
private static int count;
// 每访问一次就加1
public static int incr()
{
return ++count;
}
}
//static还有时常喝final一起组合使用,static final
备注:static修饰的方法通常是public的
静态代码块
Person
/**
* @author xuyi
* @Time 2016年8月23日 下午9:36:26
* @类名 Person
* @功能描述:演示静态代码块
* @春风十里不如你
* @备注:
*/
public class Person
{
// 静态代码块
static
{
System.out.println("hello static block");
}
private String name;
public void setName(String name)
{
this.name = name;
}
}
MainApp
public class PersonApp
{
public static void main(String[] args)
{
new Person("xuyi");
new Person("xuyi");
new Person("xuyi");
new Person("xuyi");
new Person("xuyi");
// hello static block
// 构造方法...
// 构造方法...
// 构造方法...
// 构造方法...
// 构造方法...
}
}
//由结果可知,static代码块是在类加载到内存时执行的。
final关键字
final关键字意思就是表示不可变,理解不可变这一点就很容易掌握final关键字的使用了。
举例
public class FinalDemo
{
// 定义性别为final,是无法修改的
private final String sex = "woman";
public void changeAge(final String sex)
{
this.sex = sex;//编译不通过
}
}
备注:说到final关键字,还有一个finally关键字,finally关键字通常是一段代码块,和try... 一起使用
transient关键字
transient关键字在日常开发中并没有像前面两个关键字用的那么频繁,在很少场合下使用。
transient表示瞬态、临时的,其不能序列化到文件中。
举例
User类
/**
* User实现Serializable接口
*
* @author xuyi
* @Time 2016年8月23日 下午9:02:46
* @类名 User
* @功能描述:
* @春风十里不如你
* @备注:
*/
public class User implements Serializable
{
private static final long serialVersionUID = -6719650258400731058L;
private String name;
private transient String password;
//setter 和 getter方法
@Override
public String toString()
{
return "User [name=" + name + ", password=" + password + "]";
}
}
//通常如果想要将一个对象持久化存储到磁盘中,那么通常是先将该对象序列化然后再存储。
MainApp
public class MainApp
{
public static void main(String[] args) throws Exception
{
File file = new File("e:/out.txt");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
User user = new User();
user.setName("xuyi");
user.setPassword("admin");
out.writeObject(user);
out.flush();
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
User outUser = (User) in.readObject();
in.close();
System.out.println(outUser.toString());
// 如果使用transient 修饰password,结果就是
// User [name=xuyi, password=null]
// 如果没有使用transient 修饰password,结果就是
// User [name=xuyi, password=admin]
}
}
总结
transient的作用就是阻止它所修饰的属性被序列化,瞬态的意思。
比如:
网络上传输一些客户的资料,但是对于非常敏感的数据(比如薪资,各类密码之类的)我们担心在传输过程中这些敏感数据被窃取
既然说到序列化,那就顺便提一下,如果一个变量是static的,那么无论是否有transient修饰词,都不能够别序列化,
因为序列化是序列化一个对象,static变量根本不属于任何对象
在Java中想让对象实现序列化,可以通过两种方式
1、实现Serializable接口,这种情况下,对象的序列化和反序列化都是java自己的机制自动实现的,不需要人为实现;
2、实现Externalizable接口,可以实现writeExternal()和readExternal()这两个方法,完成自己的序列化/反序列化操作;
备注:方式1比较常用,也比较简单。
参考
1、http://qifuguang.me/2016/06/24/Java-transient%E5%85%B3%E9%94%AE%E5%AD%97%E8%A7%A3%E6%9E%90/