說一說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
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。