首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的;”。显然,final关键词如果用中文来解释,“不可更改的”更为合适。当你在编写程序,可能会遇到这样的情况:我想定义一个变量,它可以被初始化,但是它不能被更改。

例如我现在想要定义一个变量保存圆周率的值,作为一个客观的、正确性有保障的值,如果在后序程序中更改它,可能会造成结果的错误,甚至程序的崩溃。那么这个时候final关键字就可以发挥它的用处了。不过,final不仅仅可以用来修饰数值,它还有其他的用法,看过下面的实例应该会有个基本的了解。

如有错误,欢迎批评指正。

1.用final来修饰数据

1.1用final来修饰数值:

//例1
public class Demo{
public static void main(String[]args){
final double PI=3.14;
System.out.println(PI);
PI=3.1;
System.out.println(PI);
}
}

如例1所示,如果修改final修饰的变量PI,会发生什么呢?

好吧,编译都不能通过,说明final修饰过后的数值变量是不能改变的。

现在又有一个疑问,如果final定义的变量,没有初始化,会不会报错?见例2:

//例2
public class Demo{
public static void main(String[]args){
final double PI;
System.out.println(PI);
}
}

还是会报错,其实这个和fina的关系不大,仅仅因为没有赋值,就算没有final,也是会报错(亲测)。

1.2上面说的是数值,如果final修饰的是对象呢?

//例3
public class Demo{
public static void main(String[]args){
final Cat cat1=new Cat(1);
Cat cat2=new Cat(2);
cat1=cat2;
}
} class Cat{
private int id=0;
private int age=0;
Cat(int id){this.id=id;}
public void setAge(int age){
this.age=age;
}
}

编译依然通不过。

但是cat1长大一岁了,我想修改一下他的年龄,可不可以呢,贴一段测试代码:

//例4
public class Demo{
public static void main(String[]args){
final Cat cat1=new Cat(1);
//Cat cat2=new Cat(2);
cat1.setAge(1);
System.out.println(cat1.getAge());
}
} class Cat{
private int id=0;
private int age=0;
Cat(int id){this.id=id;}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}

运行结果:

编译运行都毫无障碍。说明什么呢?当用final来修饰对象时,不能改变对象的引用,但是可以修改对象的属性值。cat1只能指向id为1的猫,如果让它指向cat2所指的猫,编译器会报错(例3)。

1.3用final来修饰参数

当final来修饰形参时,形参也是不能被更改的,例如我在获取年龄的时候,偷偷地改一下ID:

 

public class Demo{
public static void main(String[]args){
Cat cat1=new Cat(1);
System.out.println(cat1.getAge(1));
}
} class Cat{
private int id=0;
private int age=0;
Cat(int id){this.id=id;}
public void setAge(int age){
this.age=age;
}
public int getAge(final int id){
id++;
return this.age;
}
}

果然报错了!

2.final修饰方法(函数)的时候

一般用final修饰方法的目的是:锁住方法,防止继承它的类来修改(覆盖)它。例如Cat类是动物,所以它继承了动物类Animal,但是每个动物都有规定:不能伤害人类,所以Animal的rule方法用final修饰一下,不允许继承者们修改,代码如下:

public class Demo{
public static void main(String[]args){
Cat cat1=new Cat(1);
cat1.rule();
//System.out.println(cat1.getAge());
}
}
class Animal{
public final void rule(){
System.out.println("do not hurt people!");
}
}
class Cat extends Animal{
private int id=0;
private int age=0;
Cat(int id){this.id=id;}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public final void rule(){
System.out.println("I want to hurt people!");
}
}

当我尝试覆盖基类方法时,失败了。当然,例子举的是public修饰的方法,但如果是private修饰的方法,本身对子类就不可见,更别说覆盖了。

3. 用final来修饰类:

用final来修饰类的时,说明这个类从设计之初,就不打算用来被继承,换句话说,也不允许其他人来继承这个类,从而保证安全性。例如我在Animal类前加个final

编译报出的错误很明确:无法被继承。

4.final 和 static的区别

用final修饰,主要是为了表现“不可修改性”,从而提高安全性 。而static重点在于共享,方便。在类里创建一个static修饰的函数,则可以直接通过类名访问,该类new出来的对象,也可以共享static函数,或者static修饰的共有属性。

static的具体用法,可参考:http://www.cnblogs.com/dolphin0520/p/3799052.html

解析Java中final关键字的各种用法的更多相关文章

  1. Java中final关键字修饰变量、方法、类的含义是什么

    Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...

  2. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  3. 关于Java中final关键字的详细介绍

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

  4. java中final关键字的使用方法

     [java中为什么会有final变量]: final这个关键字的含义是"这是无法改变的"或者"终态的": 那么为什么要阻止改变呢? java语言的发明者可 ...

  5. 关于java中final关键字与线程安全性

    在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...

  6. java 中final关键字

    1.final变量,一旦该变量被设定,就不可以再改变该变量的值. final关键字定义的变量必须声明时赋值.一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,一个既是static和fina ...

  7. Java中final关键字概述

    使用final修饰过的变量都不可以改变: 1.final修饰变量 恒定不变的属性,可以用final关键字来修饰: 变量名建议全部使用大写 final修饰的变量不能改变,如果程序中重新赋值,编译报错 例 ...

  8. JAVA中final关键字的作用

    一.final关键字的功能概述 final关键字可以用来修饰引用.方法和类. 1.用来修饰一个引用 如果引用为基本数据类型,则该引用为常量,该值无法修改: 如果引用为引用数据类型,比如对象.数组,则该 ...

  9. Java中final关键字的用法

随机推荐

  1. Mac 开发配置手册

    转自:http://www.cocoachina.com/mac/20141112/10198.html 手册内容为「如何让一部全新的 MacBook 快速完成开发环境配置」,主要面向 Web 开发者 ...

  2. POJ 1753 Flip Game (状态压缩 bfs+位运算)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  3. Code First 二 DataAnnotation 数据注解

    Code-First中配置域类 我们在前一节学习了默认的代码优先约定.Code-First使用默认约定从您的域类构建概念模型.Code-First利用称为约定而不是配置的编程模式.这意味着您可以通过配 ...

  4. Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)

    简单网络管理协议SNMP服务起着代理的作用,它会收集可以向SNMP管理站或控制台报告的信息.您可以使用SNMP服务来收集数据,并且在整个公司网络范围内管理基于Windows Server 2003.M ...

  5. insert插入数据

    insert 语法1 --插入的值需要用单引号引起来,否则字段插入会有问题,可能造成查询的时候查询不出结果 insert  into  表名 (列名1,列名2……)  ] values  ( '值1' ...

  6. ORACLE学习之三

    DDL 数据定义语言 CREATE ALTER DROP DML 数据操作语言 INSERT UPDATE DELETE DQL 数据查询语言 SELECT TCL 事务控制语言 COMMIT ROL ...

  7. 闲谈Hybrid

    前言 当经常需要更换样式,产品迭代,那么我们应该考虑hybrid混合开发,上层使用Html&Css&JS做业务开发,底层透明化.上层多多样化,这种场景非常有利于前端介入,非常适合业务快 ...

  8. Oracle批量删除表格数据

    在开发阶段往Oracle数据库中多个表格中导入了许多测试数据,倘若一张张表执行"truncate table tablename"语句显得十分繁琐.在PL/SQL中可以用代码进行批 ...

  9. php http_build_query stream_context_create post请求

    <?php function send_post($url, $post_data) { $postdata = http_build_query($post_data); $options = ...

  10. 帝国cms伪静态设置方法(收藏)

    众所周知,动态页面不利于收录和排名.伪静态可以完美的解决这问题,配合百度云加速CDN,可以让动态页面有静态页面一样快的访问速度. 今天开拓族给大家带来帝国CMS伪静态的详细设置方法. 1.栏目设置为动 ...