程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 說一說java症結字final和transient

說一說java症結字final和transient

編輯:關於JAVA

說一說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

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved