首先,说说final。

final关键字可以修饰变量,方法,类。

   final变量
        需求:
            1 需要一个永不改变的编译时常量
            2 一个运行时被初始化的值,不希望被更改
        好处:
           编译时就执行的计算,减轻运行时的负担
        扩展:
           可以修饰基本类型和引用对象。修饰基本类型的时候,表示数值很定不变。修饰对象引用的时候,一旦引用被初始化指向一个对象,就无法再将它更改指向另一个对象(该对象本身是可以修改的)
        空白final
           final修饰但又没有给出初始值的域
           必须在域的的定义或构造器内用表达式给final赋值(final使用前必须初始化)
       注意:
          如果一个对象被static和final同时修饰(编译期常量),一般用大写表示,下划线链接单词
       修饰参数:
          如果final修饰参数,表示该参数可读,但无法修改。
      用法示例:

  1. private Random rand=new Random();
  2. private static Random random=new Random();
  3. private final int n1=12;
  4. private final int number=rand.nextInt(30);
  5. private static final int NUMBER2=random.nextInt(40);
  6. @Test
  7. public void finalDataTest(){
  8. System.out.println(n1);
  9. System.out.println("--------------------");
  10. System.out.println(rand.nextInt(30));
  11. System.out.println("--------------------");
  12. System.out.println("编译初始之后,不会改变:"+number);
  13. System.out.println("--------------------");
  14. System.out.println("编译初始之后,不会改变:"+NUMBER2);
  15.  
  16. }
  17. /**
  18. * final修饰参数:该参数可读,但无法修改。
  19. * @param sk
  20. * @return
  21. */
  22. public String finalParam(final String sk){
  23. //sk="jeyson"; final参数不能被修改
  24. return sk;
  25.  
  26. } 
 
    final方法:
       final也可以修饰方法,表示该方法不能被子类继承。
       使用final的好处:
         1 JDK1.5以前,效率更高,JDK1.5以后可以忽略
         2 方法锁定,确保子类中该方法含义不变,不能被覆盖
    用法示例:

  1. public final String finalMethod(){
  2. return "Hello World" ;
  3. }

  

   final类:
     不希望被任何类继承,可以使用final修饰类
    用法示例:

  1. public final class FinalClassTx {
  2. private int k ;
  3.  
  4. public void getMyWord(){
  5. System. out .println("这是一个final类,k的值是" +getK());
  6. }
  7.  
  8. public int getK() {
  9. return k ;
  10. }
  11. public void setK( int k) {
  12. this .k = k;
  13. }
  14.  
  15. }

 然后 transient关键字:

 

   transient只能修饰变量,表示该变量不能被序列化。
   一般我们继承Serializable接口的类,序列化会自动进行,使用transient修饰的变量在该类被序列化的时候,不会序列化到指定目的地。
   所以,
     1 被transient修饰的变量不再是对象持久化的一部分,该变量内容序列化无法获得访问
     2 transient只能修饰变量,不能修饰方法和类
     3 一个静态变量无论是否被transient修饰,都不能被序列化
   用法示例:

  1. public class TransientEx {
  2.  
  3. public static void main(String[] args) {
  4. User user=new User();
  5. user.setUsername("jeyson");
  6. user.setPassword("123456");
  7. System.out.println("序列化前:");
  8. System.out.println(" username="+user.getUsername());
  9. System.out.println(" password="+user.getPassword());
  10. //序列化
  11. try {
  12. ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("C://MyResource//test1.txt"));
  13. os.writeObject(user);
  14. os.flush();
  15. os.close();
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. //反序列化
  20. try {
  21.  
  22. ObjectInputStream is=new ObjectInputStream(new FileInputStream("C://MyResource//test1.txt"));
  23. user=(User) is.readObject();
  24. is.close();
  25. System.out.println("序列化后:");
  26. System.out.println(" username="+user.getUsername());
  27. System.out.println(" password="+user.getPassword());
  28.  
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println("--------------------------------");
  33.  
  34. }
  35. }
  36.  
  37. class User implements Serializable{
  38.  
  39. private static final long serialVersionUID = 1L;
  40.  
  41. private String username;
  42. //使用 transient
  43. private transient String password;
  44. public String getUsername() {
  45. return username;
  46. }
  47. public void setUsername(String username) {
  48. this.username = username;
  49. }
  50. public String getPassword() {
  51. return password;
  52. }
  53. public void setPassword(String password) {
  54. this.password = password;
  55. }
  56.  
  57. }

  扩展:Externalizable

实现了serializable接口的类,所以序列化会自动进行

       实现了Externaliazble接口的类,没有任何东西可以自动序列化,无论是否使用transient对结果都没有影响。
        此时如果需要序列化,需要在writeExternal方法中上进行手动指定所要序列化的变量。
     使用示例:

  1. public class ExternalizableEx implements Externalizable {
  2. private transient String name="ssss";
  3.  
  4. @Override
  5. public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
  6. name=(String) in.readObject();
  7.  
  8. }
  9.  
  10. @Override
  11. public void writeExternal(ObjectOutput out) throws IOException {
  12. out.writeObject(name);
  13. }
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. public static void main(String[] args) {
  24. ExternalizableEx ex=new ExternalizableEx();
  25. ex.setName("jeyson");
  26. System.out.println("Externalizable序列化前:");
  27. System.out.println(ex.getName());
  28. //序列化
  29. try {
  30. ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(new File("C://MyResource//test2.txt")));
  31. os.writeObject(ex);
  32. os.flush();
  33. os.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. //反序列化
  38. try {
  39. ObjectInputStream is=new ObjectInputStream(new FileInputStream(new File("C://MyResource//test2.txt")));
  40. ex=(ExternalizableEx) is.readObject();
  41. is.close();
  42. System.out.println("Externalizable序列化后:");
  43. System.out.println(ex.getName());
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }

 声明:

final大部分来自《java编程思想》第四版

transient相关部分参考自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

java关键字---final和transient的更多相关文章

  1. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  2. 【转】Java关键字final、static使用总结

    转自:http://lavasoft.blog.51cto.com/62575/18771/   Java关键字final.static使用总结   一.final        根据程序上下文环境, ...

  3. Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  4. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...

  5. Java关键字final、static使用总结(转)

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  6. (转)Java关键字final、static使用总结

    一.final  根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...

  7. [Java] 关键字final、static使用总结

    一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final ...

  8. java 关键字final static native详解

    java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...

  9. Java关键字final、static使用总结(转)

    原文链接:Java关键字final, static一些要点 1. final   final类不能被继承,没有子类,final类中的方法默认是final的 final方法不能被子类的方法复盖,但可以被 ...

随机推荐

  1. 3.2 使用STC89C52控制MC20发送短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  2. BGP Basic Knowledge

    声明: 这篇文章是对网上的这几篇博客的摘录,仅供我自己以后看的时候方便,且不需要再看太多的内容, 如果大家对BGP不是很了解,建议看原博客或者直接看RFC     BGP只支持基于目的地址的路由,即路 ...

  3. source $0 & bash $0

    bash file.sh这种形式启动时,$0才被设置成文件名. source是bash的内建命令,把文件读取到当前bash中执行,相当于在当前bash手动输入命令,所以$0是bash. 示例代码如下: ...

  4. Vim 指令一览表

    vim 程序编辑器 移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键( ...

  5. Java Web项目在Mac系统上启动时提示nodename nor servname provided

    今天一不小心更新了Mac系统,然后在启动Java Web项目的时候,提示了java.net.UnknownHostException: MAC-mini-local nodename nor serv ...

  6. 02 Spring框架 简单配置和三种bean的创建方式

    整理了一下之前学习Spring框架时候的一点笔记.如有错误欢迎指正,不喜勿喷. 上一节学习了如何搭建SpringIOC的环境,下一步我们就来讨论一下如何利用ioc来管理对象和维护对象关系. <? ...

  7. ubuntu安装java jdk

    openjdk安装http://openjdk.java.net/install/ 一.下载 首先,当然是要下载了. 地址:http://www.oracle.com/technetwork/java ...

  8. 对象数组空指针异常说明——C#中使用对象数组必须分别为其开辟空间

    l  场景 定义一个学生类,包含字段(学号,姓名,语文成绩,数学成绩,英语成绩).属性(总成绩).三个方法分别为(求平均分.数学平均分.语文平均分). 要求:在main()方法中,定义一个学生类型的数 ...

  9. axios拦截器/http

    Interceptors //处理请求或响应之前拦截请求或响应. //添加一个请求拦截器 axios.interceptors.request.use(function (config) { //在请 ...

  10. QT线程

    一.QObject子类 说明:以串口线程传输文件为例子,使用的是MoveTothread函数. void QObject::moveToThread(QThread *targetThread)可以将 ...