• 关于Java中的final关键字


    Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的。final可以用来修饰:变量、方法、类。

    1)Java final variable

    final用来修饰变量时,该变量的值是不能改变的,其实就变成了常量,等同于c++中的constant关键字。来个栗子尝尝:

     1 class Bike9{  
     2  final int speedlimit=90;//final variable  
     3  void run(){  
     4   speedlimit=400;  
     5  }  
     6  public static void main(String args[]){  
     7  Bike9 obj=new  Bike9();  
     8  obj.run();  
     9  }  
    10 }//end of class  
    Output:Compile Time Error

    这段代码中的speedlimit变量被final修饰,在run() 方法中试图对该变量进行修改,于是乎编译器如愿以偿地报错了,因为被final修饰的变量只能被赋值一次,一旦赋值,其值不能再被改变。

    2)Java final method

    被final修饰的方法,不能被覆盖。举个栗子:

     1 class Bike{  
     2   final void run(){System.out.println("running");}  
     3 }  
     4      
     5 class Honda extends Bike{  
     6    void run(){System.out.println("running safely with 100kmph");}  
     7      
     8    public static void main(String args[]){  
     9    Honda honda= new Honda();  
    10    honda.run();  
    11    }  
    12 }  
    Output:Compile Time Error

    编译器再次如我们所愿,父累Bike的run() 方法被final修饰,子类Honda试图覆盖父类的该方法,编译报错。

    3)Java final class

    被final修饰的类不能被继承。再来一颗栗子:

     1 final class Bike{}  
     2   
     3 class Honda1 extends Bike{  
     4   void run(){System.out.println("running safely with 100kmph");}  
     5     
     6   public static void main(String args[]){  
     7   Honda1 honda= new Honda();  
     8   honda.run();  
     9   }  
    10 }  

    结果都不用看了,跟上面一样。

    Q)final 方法能被继承吗?

    Ans)可以,子类不能覆盖父类的final方法,但是可以继承之。栗子:

    1 class Bike{  
    2   final void run(){System.out.println("running...");}  
    3 }  
    4 class Honda2 extends Bike{  
    5    public static void main(String args[]){  
    6     new Honda2().run();  
    7    }  
    8 }  
    Output:running...

    父类Bike的final run() 方法在子类Honda2中能够正常调用。

    Q)何为未被初始化的 final 变量?

    Ans)在声明final修饰的变量的时候没有初始化的变量,也称为 blank final 变量。

    考虑这样一个场景,一个对象的某个字段,只有在该对象被实例化的时候被赋值一次,以后该字段的值不会被改变。这个时候blank final 变量就派上用场了。

    1 class Student{  
    2 int id;  
    3 String name;  
    4 final String PAN_CARD_NUMBER;  
    5 ...  
    6 }  

    Student中的PAN_CARD_NUMBER 字段只有在学生实例被创建的时候赋值一次,以后不会改变。

    Q)何时初始化blank final 变量?

    Ans)blank final 变量只能在构造函数中初始化。

    Q)何为 static blank final 变量?

    Ans)被static 和final 修饰的,在声明的时候未被初始化的变量。static blank final 变量只能在静态代码块中被初始化。栗子:

    1 class A{  
    2   static final int data;//static blank final variable  
    3   static{ data=50;}  
    4   public static void main(String args[]){  
    5     System.out.println(A.data);  
    6  }  
    7 }  

    Q)何为final参数?

    Ans)被final修饰的参数,该参数的值不能改变。栗子:

     1 class Bike11{  
     2   int cube(final int n){  
     3    n=n+2;//can't be changed as n is final  
     4    n*n*n;  
     5   }  
     6   public static void main(String args[]){  
     7     Bike11 b=new Bike11();  
     8     b.cube(5);  
     9  }  
    10 } 

    上述代码中,cube() 方法的参数n被final修饰,其内部对n试图修改将产生编译错误。

    Q)构造函数能声明为final吗?

    Ans)不能,因为构造函数从来不会被继承。

  • 相关阅读:
    jQuery Timer 实现的新邮件提醒
    在 jquery repeater 中添加设置日期,下拉,复选框等控件
    jquery repeater 完成 QQ 邮箱邮件分组显示功能
    Ajax 与 WebService 之间日期等数据类型的转换
    通过 Parameter 对象添加 Ajax 请求时的参数
    在 jQuery Repeater 进行验证更新等操作时提示消息
    jquery repeater 模仿 Google 展开页面预览子视图
    在 jQuery Repeater 中检索过滤数据
    功能完善的 jquery validator 完成用户注册的验证
    在 Repeater 中绑定转化 JSON 格式的字段
  • 原文地址:https://www.cnblogs.com/HarrisonHao/p/6103260.html
Copyright © 2020-2023  润新知