原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html

一、概述

  final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。

  有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。

  finally关键字不同于final关键字,这是一个需要与异常体系结构配合使用的关键字,旨在定义必须要进行操作,一般用于在发生异常的时候进行一些收尾操作。

二、final作用

2.1 final修饰变量

  变量被final修饰就会变成为常量,常量被保存在方法区中。

  变量一旦被final修饰,必须手动进行初始化,未进行初始化的final常量是无法通过编译的。

  如果只有final修饰的变量的初始化可以采用:

    --定义时赋值

    --代码块赋值

    --构造器赋值

  如果被static和final同时修饰的变量的初始化可以采用:

    --定义时赋值

    --静态代码块赋值

  一旦final变量被static修饰,那么它就脱离了对象的组织(代码块、构造器都是对象的组织),升级为类的组织,所以需要在类级别的静态代码块中进行初始化。

 public class FinalTest {
final int i = 1;
int j = 2;
static int m = 3;
static final int n = 4;
}

  或

 public class FinalTest {
final int i;
int j;
static int m;
static final int n;
{
i = 1;
}
static {
n = 3;
}
}

  如果将上面的代码改成:

 public class FinalTest {
final int i;
int j;
static int m;
static final int n;
}

  上面代码第2行和第5行会报错,原因就是未进行初始化。

  那么我们总结下final和static的现象,用于区分二者:

    static修饰将内容脱离对象成为类成员。

    final修饰将内容改造成必须被手动初始化的成员,一旦赋值,不再改变。

    注意:同时被final和static修饰的变量成为静态常量,类常量,这种类常量在编译阶段会进行常量传播优化,将该类常量的值直接保存到调用类的常量池中,那么在程序执行到调用位置时,实际上与定义该类常量的类已经毫无关系,我(调用方)可以直接在我的常量池中获取到编译阶段优化过来的值,不再需要通过常量定义类的类型去调用其中定义的那个类常量了。

  二者可以同时存在,各起各的作用。

2.2 final修饰方法

  被final修饰的方法,可以被子类继承,但是不能被子类重写,也就是说这个方法在此以后其内部的实现就是固定不变的了,不能被改变。

2.3 final修饰类

  被final修饰的类,被称之为最终类,其不再拥有子类,不可再进行扩展,最常见的final类就是String类。

  String类被final修饰之后,其每个对象都是不变的,一旦定义就不再发生改变。

2.4 final修饰局部变量

  final修饰的局部变量,该变量就不再是保存在栈空间中,而是保存在方法区中,不会随方法结束而失效,放大了局部变量的生命周期。

  最常使用的地方就是局部内部类在访问方法的局部变量的情况下,这些局部变量就需要使用final修饰,因为当局部内部类访问局部变量时,会放大局部变量的作用域,局部变量一般在方法结束时就失效了,但是却有可能任然被内部类的对象持有使用。将该局部变量定义为final之后,它不再保存于栈空间,而是保存在方法区中,自然不会因为方法的结束而丢失。

     public void outMethod(){
final int s = 1;
class innerClass{
public void innerMethod(){
System.out.println(s);
}
}
}

  如果去掉第2行的final,第5行就会报错。

2.5 final修饰方法参数

  如果方法的参数被final修饰,那么这个参数的值在从方法调用时赋值开始就不能再改变,不能被重新赋值(不能改成他值)。

     public void outMethod(final int s){
// s = 1;
}

  如上代码,方法参数s为final的,那么若去掉第2行的代码,为s重新赋值,则会报错。

三、finally作用

  finally只有一种用法,那就是在try...catch..语句末尾使用。语法如下:

 try{
//someExecute
}catch(Execption e){
//someExecute
}finally{
//someExecute
}

  finally块中的语句是一定会被执行的,无论是否会发生异常,重点:这里的异常指的是在try块中的部分,如果实在try块之前发生了异常,还没来得及执行try块语句,那么finally块中的内容也不会被执行,所以finally针对的是try块中的内容而设的。

  如果在try块或catch块中存在return语句,那么,finally块中的内容必然会在return之前执行。

  finally经常用于发生异常的情况下关闭打开的资源,比如io流,网络资源等。

Java基础系列--final、finally关键字的更多相关文章

  1. Java基础系列--final关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...

  2. Java基础系列--static关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...

  3. 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理

    目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 ...

  4. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  5. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...

  6. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...

  7. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...

  8. 夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...

  9. 夯实Java基础系列9:深入理解Class类和Object类

    目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...

随机推荐

  1. 学习Acegi应用到实际项目中(2)

    Acegi应用到实际项目中(1)是基于BasicProcessingFilter的基本认证,这篇改用AuthenticationProcessingFilter基于表单的认证方式. 1.authent ...

  2. 部署eclipse项目到tomcat

    1.为了以防万一,将本地tomcat版本及其jdk版本与服务器上的版本最好是相同的 2.在本地eclipse下运行项目即可发布(注意(1)数据库连接的是服务器数据库还是本地数据库(2)运行项目前先cl ...

  3. Hiberbate注解

    JPA:出现后,所有的ORM框架都有@注解  ,在所有的ORM框架里面是通用的,因此一般是建议大家使用注解进行配置. 实体类一般都有唯一属性,普通属性,集合属性 如何体现ORM思想的? @Entity ...

  4. ReSharper 10.0.0.1 Ultimate 完美破解补丁使用方法

    转自:http://www.leavescn.com/Page/Content.aspx?id=94 ReSharper 10.0.0.1 Ultimate 完美破解补丁使用方法,本资源来自互联网,感 ...

  5. Python json和pickle模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  6. Azure DevOps Server(TFS): 在Excel中解除服务器同步

    通过Azure DevOps Server 提供与Excel集成的功能,用户可以非常便捷地使用Excel,实现工作项数据的同步. 对于需要批量处理数据.离线工作.制作临时报表的用户来说,这个功能必定成 ...

  7. 2019-4-22 jdbc学习笔记

    jdbc 一.定义:java database connector 二.常用的接口 java.sql.Driver  驱动 java.sql.Connection  链接 java.sql.State ...

  8. Windows 远程栈溢出挖掘与利用

    缓冲区溢出攻击很容易被攻击者利用,因为 C 和 C++等语言并没有自动检测缓冲区溢出操作,同时程序编写人员在编写代码时也很难始终检查缓冲区是否可能溢出.利用溢出,攻击者可以将期望数据写入漏洞程序内存中 ...

  9. Javascript高级编程学习笔记(6)—— 流程控制语句

    话不多说,我们直接开始进入今天的主题 流程控制语句 首先什么是流程控制语句呢? 顾名思义,就是控制流程的语句. 在JS中语句定义了ECMAScript中的主要语法,让我们可以使用一系列的关键字来完成指 ...

  10. 判断字符串是否为正整数 & 浮点小数

    /** * 判断字符串是否为数字(正整数和浮点数) * @param str * @return */public static boolean isNumeric(String str) { Str ...