首先,我们可以从字面上理解一下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. java基本方法

    Java 方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println() 是一个方法. System 是系统类. out 是标准输出对象. 这句话 ...

  2. stylus(css预编译器)

    推荐去张鑫旭大神这里详细了解:http://www.zhangxinxu.com/jq/stylus/ 安装 npm install -g stylus 自动编译 $ stylus -w demo.s ...

  3. 用java数组模拟登录和注册功能

    package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...

  4. linux 安装 node 环境

    本篇学习的分享主要说在linux 安装 node 环境,个人也是在腾讯云的实验室课程学习的,这里只是个人的一个学习记录, 大家也可以去腾讯的实验室来体验一下,教程十分详细易学. 1 .安装 Node. ...

  5. HTML+jq简单轮播图

    .main{    width: 100%;    min-width: 1100px;    display: table;    margin: 0 auto;    text-align: ce ...

  6. js实现99乘法表的编写(双层for循环与递归方法)

    双层for循环实现方法: function nine (num) { ; i <= num; i++){ var str = ''; ; k <= num; k++){ if(i > ...

  7. 5. CSS是什么

    CSS概念 CSS,层叠样式表,也叫做风格样式表.通过CSS我们可以为页面添加一个美丽的外观,获得更加良好的用户体验.不过值得我们注意的是和HTML一样,CSS也不是编程语言,它只是提供一种配置文件, ...

  8. Python系列之入门篇——pytables及其客户端

    pytables及其客户端查看 pytables # ubuntu sudo apt-get install python-tables pip install flask flask-httpaut ...

  9. transform Vs Udf

    在鞋厂的第一个任务,拆表.需要把订单表按照开始日期和结束日期拆分成多条记录,挺新鲜的~ transform方式,使用到了python. (1)把hive表的数据传入,通过python按照日期循环处理, ...

  10. 【Android】添加依赖包

    貌似好像不知一种方法,以后有时间再研究,下面是其中的一种方法