Java关键字之static、final、transient

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值