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/