zoukankan      html  css  js  c++  java
  • 关于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)不能,因为构造函数从来不会被继承。

  • 相关阅读:
    重大利好,Dubbo 3.0要来了。
    SaaS,PaaS,IaaS都是什么鬼?
    为什么Netty这么火?与Mina相比有什么优势?
    (21)python lambda表达式
    (19)python scrapy框架
    (18) python 爬虫实战
    (5)ASP.NET HTML服务器控件
    (17)python Beautiful Soup 4.6
    (4)ASP.NET内置对象1
    (16)网络爬虫
  • 原文地址:https://www.cnblogs.com/HarrisonHao/p/6103260.html
Copyright © 2011-2022 走看看