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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章