一、static
static 可以用來修飾變量、方法、代碼塊。
1. static 修飾變量:
被 static 修飾的變量叫靜態變量或類變量, 沒有被 static 修飾的變量叫實例變量。
在運行時期, JVM 在加載類的時候將完成對靜態變量/類變量分配一次內存空間, 且在內存上只存在一份拷貝, 類的所有實例將共享這份拷貝。
靜態變量/類變量獨立于該類的任何對象, 它不依賴類的特定實例, 可以通過類名來訪問得到, 也可以通過實例名來訪問(不建議)。
而對于實例變量, 是每次創建類的實例的時候都會為實例變量分配一次內存空間, 實例變量在內存上可能存在多個拷貝, 但它們之間互不影響。
2. static 修飾方法
被 static 修飾的方法稱為靜態方法, 與靜態變量相似的, 它獨立于該類的任何對象, 它不依賴類的特定實例。
因此靜態方法中不能使用 this、super 關鍵字, 也不能調用非靜態的變量或方法(因為非靜態是需依賴于具體的實例, 如果調用, 則不能保證其被正確初始化,
而 Java 編譯器是不允許你這么做的)。靜態方法可以通過類名來訪問得到, 也可以通過實例名來訪問(不建議)。
3. static 修飾代碼塊
被 static 修飾的代碼塊叫靜態代碼塊, JVM 在加載類的時候就會執行這些靜態代碼塊, 而且只會被執行一次, 因此靜態代碼塊會比類的構造方法優先執行。
如果一個類中的靜態代碼塊有多個,JVM 將按照它們在類中出現的先后順序依次執行它們。
二、final
final 譯成中文是最終的和不可更改的意思, 它可以用來修飾非抽象類, 非抽象成員方法和變量。
1. final 修飾類
final 不能用來修飾 abstract 的類, 不能被繼承, 它是頂級類, 沒有子類, 像我們常用的 String 類
2. final 修飾變量
final 用來修飾變量, 那就意味著該變量一旦初始化完成, 那么它的值就不能夠再被改變。
因此, final 修飾的變量必須由程序員手動去做初始化給變量賦值, 而且初始化的位置只能是: 定義處、構造方法、普通代碼塊(不能是靜態代碼塊)。
而且這三個位置中只能選擇一處來做初始化。
[小延伸: 普通代碼塊實際上會被提取到構造方法中來執行, 而且會比構造方法體內的代碼優先執行。]
3. final 修飾方法
final 用來修飾方法表示不允許其子類來覆蓋這個方法。
final 不能用來修飾構造器(構造方法、構造函數、構造子), 因為父類的構造器不能夠被繼承, 類內的 private 方法也不能夠被子類繼承,
也就不存在覆蓋之說法, 覆蓋僅適用于成員方法, private 修飾的方法實際上默認也是 final 類型的。
三、transient
這個比較陌生, 其實我壓根就沒用過.... -_-|| 在 java 源碼里見到過, 不過沒有用到的東西向來學了就忘的很干脆, 這次是為了找工作, 重新整理一遍。
@Transient 相信很多人都認識這個, 在編一個實體類寫 JPA(Java Persistence API, Java 持久化 API)注解的時候, 會常常用到這個注解。
而這里的 transient 和 @Transient 的作用很相似:
Java 的 Serializable 提供了一種持久化對象實例的機制。當一個對象發生持久化時, 可能會有一些特殊的數據成員,
是我們不希望用 Serializable 機制來保存的。為了在一個特定對象的一個或多個域上關閉持久化, 可以在這個域前加上關鍵字 transient。
transient 是 Java 的關鍵字, 用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候, 被聲明成 transient 的變量的值
不會包括在串行化里面。
示例:
package test;
import java.io.Serializable;
public class Admin implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String nickname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
package test;
/**
* <!--
* Author : fancy
* Email : fancydeepin@yeah.net
* Date : 2013-02-07
* --!>
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class AdminTest {
public static void main(String[] args) throws Exception{
Admin admin = new Admin();
admin.setName("店小三");
admin.setNickname("小菜一疊");
writeObject(admin);
System.out.println("<------------- 序列化之前 ------------->");
System.out.println("姓名: " + admin.getName());
System.out.println("昵稱: " + admin.getNickname());
admin = (Admin)readObject();
System.out.println("<------------- 反序列化后 ------------->");
System.out.println("姓名: " + admin.getName());
System.out.println("昵稱: " + admin.getNickname());
/**
* 控制臺執行輸出結果:
*
* <------------- 序列化之前 ------------->
* 姓名: 店小三
* 昵稱: 小菜一疊
* <------------- 反序列化后 ------------->
* 姓名: 店小三
* 昵稱: null
*/
}
//序列化
public static void writeObject(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("admin.ser"));
oos.writeObject(obj);
}
//反序列化
public static Object readObject() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("admin.ser"));
return ois.readObject();
}
}
posted on 2013-02-07 12:14
fancydeepin 閱讀(1905)
評論(0) 編輯 收藏