您的位置:首页 > 编程语言 > Java开发

Java关键字之static、final、transient

2016-08-23 21:50 357 查看

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java class 对象