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

1)Java final variable

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

 class Bike9{
final int speedlimit=90;//final variable
void run(){
speedlimit=400;
}
public static void main(String args[]){
Bike9 obj=new Bike9();
obj.run();
}
}//end of class
Output:Compile Time Error

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

2)Java final method

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

 class Bike{
final void run(){System.out.println("running");}
} class Honda extends Bike{
void run(){System.out.println("running safely with 100kmph");} public static void main(String args[]){
Honda honda= new Honda();
honda.run();
}
}
Output:Compile Time Error

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

3)Java final class

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

 final class Bike{}  

 class Honda1 extends Bike{
void run(){System.out.println("running safely with 100kmph");} public static void main(String args[]){
Honda1 honda= new Honda();
honda.run();
}
}

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

Q)final 方法能被继承吗?

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

 class Bike{
final void run(){System.out.println("running...");}
}
class Honda2 extends Bike{
public static void main(String args[]){
new Honda2().run();
}
}
Output:running...

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

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

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

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

 class Student{
int id;
String name;
final String PAN_CARD_NUMBER;
...
}

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

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

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

Q)何为 static blank final 变量?

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

 class A{
static final int data;//static blank final variable
static{ data=50;}
public static void main(String args[]){
System.out.println(A.data);
}
}

Q)何为final参数?

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

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

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

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

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

关于Java中的final关键字的更多相关文章

  1. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  2. 深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  3. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  4. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  5. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  6. 转载:浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  7. java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  8. 浅析Java中的final关键字(转)

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  9. Java基础——深入理解Java中的final关键字(转载)

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

随机推荐

  1. spark 大数据 LR测试

    #!/bin/bash size="120Y*10W"date1=`date +%F_%H-%M-%S`config="spark-submit \ --jars /da ...

  2. 【noip 2016】 蚯蚓(earthworm)

    100分程序,写了2天+1小时 →题目在这里← 大神就是厉害--写的程序居然看都看不懂,还有就是cena上过了但是luogu上一直是恶心的TLE 首先是考虑p=0时,数组大小开到了1100000,然后 ...

  3. JSP实现在项目在网页上查询

    <table> <caption>user</caption> <tr> <td>编号</td> <td>姓名< ...

  4. <web Font的使用>

    使用font-face将字体引入web中 先将字体文件复制到项目的font文件夹中,CSS样式如下: @font-face { font-family: 'iconfont'; /*字体名称*/ sr ...

  5. 读取XML直接转换为类对象

    <?xml version="1.0" encoding="utf-8"?> <ArrayOfMenuItems xmlns:xsi=&quo ...

  6. golang reflect

    golang reflect go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package main import ( "fmt" "reflect ...

  7. jQuery编程的最佳实践

    好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益. 加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN ...

  8. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  9. Html5 设置菱形链接菜单

    本例是采用html5+css3.0设置的菜单链接.其中主要用到了以下几个方面: 1. CSS3.0中的2D变换,如:旋转transform:rotate(45deg);移动,放大transform:r ...

  10. jquery插件的两种形式

    这里总结一下jquery插件的两种形式,一种是通过字面量的形式组织代码,另一种是通过构造函数的方式.下面就两种形式来分析俩个例子. 例子1: ;(function ($,window,document ...