說一說java症結字final和transient。本站提示廣大學習愛好者:(說一說java症結字final和transient)文章只能為提供參考,不一定能成為您想要的結果。以下是說一說java症結字final和transient正文
起首,說說final。
final症結字可以潤飾變量,辦法,類。
final變量:
需求:
1 須要一個永不轉變的編譯經常量
2 一個運轉時被初始化的值,不願望被更改
利益:編譯時就履行的盤算,加重運轉時的累贅
擴大:
可以潤飾根本類型和援用對象。潤飾根本類型的時刻,表現數值很定不變。潤飾對象援用的時刻,一旦援用被初始化指向一個對象,就沒法再將它更改指向另外一個對象(該對象自己是可以修正的)
空白final
final潤飾但又沒有給出初始值的域
必需在域的的界說或結構器內用表達式給final賦值(final應用前必需初始化)
留意:
假如一個對象被static和final同時潤飾(編譯期常量),普通用年夜寫表現,下劃線鏈接單詞
潤飾參數:
假如final潤飾參數,表現該參數可讀,但沒法修正。
用法示例:
private Random rand=new Random();
private static Random random=new Random();
private final int n1=12;
private final int number=rand.nextInt(30);
private static final int NUMBER2=random.nextInt(40);
@Test
public void finalDataTest(){
System.out.println(n1);
System.out.println("--------------------");
System.out.println(rand.nextInt(30));
System.out.println("--------------------");
System.out.println("編譯初始以後,不會轉變:"+number);
System.out.println("--------------------");
System.out.println("編譯初始以後,不會轉變:"+NUMBER2);
}
/**
* final潤飾參數:該參數可讀,但沒法修正。
* @param sk
* @return
*/
public String finalParam(final String sk){
//sk="jeyson"; final參數不克不及被修正
return sk;
}
final辦法:
final也能夠潤飾辦法,表現該辦法不克不及被子類繼續。
應用final的利益:
1 JDK1.5之前,效力更高,JDK1.5今後可以疏忽
2 辦法鎖定,確保子類中該辦法寄義不變,不克不及被籠罩
用法示例:
public final String finalMethod(){
return "Hello World" ;
}
final類:
不願望被任何類繼續,可使用final潤飾類
用法示例:
public final class FinalClassTx {
private int k ;
public void getMyWord(){
System. out .println("這是一個final類,k的值是" +getK());
}
public int getK() {
return k ;
}
public void setK( int k) {
this .k = k;
}
}
然後transient症結字:
transient只能潤飾變量,表現該變量不克不及被序列化。
普通我們繼續Serializable接口的類,序列化會主動停止,應用transient潤飾的變量在該類被序列化的時刻,不會序列化到指定目標地。
所以,
1 被transient潤飾的變量不再是對象耐久化的一部門,該變量內容序列化沒法取得拜訪
2 transient只能潤飾變量,不克不及潤飾辦法和類
3 一個靜態變量不管能否被transient潤飾,都不克不及被序列化
用法示例:
public class TransientEx {
public static void main(String[] args) {
User user=new User();
user.setUsername("jeyson");
user.setPassword("123456");
System.out.println("序列化前:");
System.out.println(" username="+user.getUsername());
System.out.println(" password="+user.getPassword());
//序列化
try {
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("C://MyResource//test1.txt"));
os.writeObject(user);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
//反序列化
try {
ObjectInputStream is=new ObjectInputStream(new FileInputStream("C://MyResource//test1.txt"));
user=(User) is.readObject();
is.close();
System.out.println("序列化後:");
System.out.println(" username="+user.getUsername());
System.out.println(" password="+user.getPassword());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("--------------------------------");
}
}
class User implements Serializable{
private static final long serialVersionUID = 1L;
private String username;
//應用 transient
private transient String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
擴大:Externalizable
完成了serializable接口的類,所以序列化會主動停止
完成了Externaliazble接口的類,沒有任何器械可以主動序列化,不管能否應用transient對成果都沒有影響。
此時假如須要序列化,須要在writeExternal辦法中長進行手動指定所要序列化的變量。
應用示例:
public class ExternalizableEx implements Externalizable {
private transient String name="ssss";
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name=(String) in.readObject();
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
ExternalizableEx ex=new ExternalizableEx();
ex.setName("jeyson");
System.out.println("Externalizable序列化前:");
System.out.println(ex.getName());
//序列化
try {
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(new File("C://MyResource//test2.txt")));
os.writeObject(ex);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
//反序列化
try {
ObjectInputStream is=new ObjectInputStream(new FileInputStream(new File("C://MyResource//test2.txt")));
ex=(ExternalizableEx) is.readObject();
is.close();
System.out.println("Externalizable序列化後:");
System.out.println(ex.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
聲明:
final年夜部門來自《java編程思惟》第四版
參考文章:http://www.jb51.net/article/86996.htm
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。