前面在讲解String时提到了final关键字,本文将对final关键字进行解析。

staticfinal是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们来了解一下final关键字及其用法。

final从总体上来说是“不可变的”,可用于修改类、方法、变量。

一. final类

final修饰的类,该类不能被继承。当你确认一个类永远不会被继承或不想被继承,那么就可以用final修饰。

同样,对于接口(interface)和抽象类(abstract Class),其本就是为了“多态”而设计,自然无法用final关键字修饰

final类中的成员方法默认也被隐式指定为final方法。

二. final方法

final修饰的方法不可被重写。

例子:

/**
* 父类
* @author LH
*/
public class FinalDemo1 {
public final void test() { }
}

三. final变量

final变量包括成员变量和局部变量。变量类型包括基本数据类型、对象。

通过final修饰局部基本类型变量(及其包装类),数值一经初始化(可以定义时初始化,也可以在使用前初始化)不可改变。如:

final int a = 0;
a = 1;//报错
final int b;
b = 1;//编译通过

通过final修饰局部引用类型变量时,其引用的对象(内存地址)(可以定义时初始化,也可以在使用前初始化)不可改变,但对象中存放的数据可以改变

public static void main(String[] args) {
final String str1 = "helloWorld";
str1 = "helloChina";//编译出错,String的不可变性,此处返回的是新的对象引用。 final StringBuilder sb = new StringBuilder("hello");
sb.append("world");//编译通过 sb = new StringBuilder("China");//编译出错
}

final修饰的成员变量必须在定义的时候直接初始化,否则会编译出错

public class FinalDemo1 {
public final int age;//final修饰的基本类型,编译出错
public final int age1 = 20;//final修饰的基本类型,编译通过
public final StringBuilder address;// final修饰的引用类型,编译出错
public final StringBuilder address1 = new StringBuilder("中国");//final修饰的引用类型,编译通过
}

那么final变量与普通变量之间到底有何区别,看下面的例子

public static void main(String[] args) {
String str0 = "helloWorldChina";
String str1 = "helloWorld";
String str3 = str1 + "China";
System.out.println(str0 == str3);//false final String str2 = "helloWorld";
String str4 = str2 + "China";
System.out.println(str0 == str4);//true final String str5;
str5 = "helloWorld";
String str6 = str5 + "China";
System.out.println(str0 == str6);//false
}

str0 == str3运行结果为false,这是因为通过“+”生成了一个新的字符串对象,返回的引用地址和str0不再一样,这在《Java基础(三) String深度解析》中有讲解。

那么str0 == str4的执行结果为什么是true?

通过final修饰的变量,如果在编译期都可以知道确切值(定义变量的时候就初始化),那么在编译器会将其当做常量使用,所有用到该变量的地方就相当于直接使用该常量,String str4 = str2 + "China" 在编译期间都已经合并处理成String str4 = "helloWorldChina",因此str0与str4引用了常量池中同一个字符串字面量的地址,故而结果为true。

而str0 == str6的执行结果为false也很好理解

str5在编译期并不知道确切值,而是在使用之前才进行初始化,因此编译器无法事先进行合并处理,str6通过“+”生成了一个新的字符串对象,返回的引用地址和str0也不再一样。

而针对基本数据类型来说定义为final变量与普通变量,比较结果来说并无差异

public static void testint(){
int int0 = 8;
final int int1;
int1 = 4;
int int2 = int1 + 4;
System.out.println(int2 == int0);//true
}

因为基本数据类型并不存在引用传递的概念,基本类型变量也是字面常量,所以对基本类型的操作都是直接对值的操作,和引用不一样,比较的并非地址。

四. 总结

本文主要对final关键字的原理进行了讲解,同时对其基本用法进行了说明,包括final修饰的类,final修饰的方法和final修饰的变量,另外文中String变量通过==比较只是为了更加清晰的说明final原理,实际应用场景比较的时候还是用equals()方法,final也经常和static配合使用作为“全局常量”,若有不对之处,请批评指正,望共同进步,谢谢!

Java基础(五) final关键字浅析的更多相关文章

  1. 【Java基础】final关键字总结

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

  2. Java基础(三)-final关键字分析

    今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...

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

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

  4. java 基础 1 final关键字

    1. final关键字 数据:声明数据为常量,对于基本类型final使数值不变,对于引用类型final使引用不变,但引用所指向的值是可以改变的,例如       final StringBuffer ...

  5. Java基础(三)--final关键字

    final通常是指"不可改变的",例如我们使用的常量 通常可以有三种使用情况: 一.final修饰数据 如果final修饰数据,也就是通常所说的常量,从字面上看,常量就是不能修改的 ...

  6. java基础之final关键字

    final: 意为终态.在java中得注意以下四点: 1.final是一个修饰符,可修饰变量,方法,类. 2.final修饰子类不可以被继承. 3.final修饰的方法不可以被重写(覆盖) 4.对于一 ...

  7. Java中的final关键字--浅析

    final基本用法: 修饰类,类不能被继承 修饰方法,方法不能被重写 修饰变量,变量变常量,不可修该 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类 ...

  8. 浅析Java中的final关键字

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

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

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

随机推荐

  1. Linux四个常用的指挥机关处理具体的解释

    原版的Blog.转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 权限 对于文件 r 可读 w 可写 x 可运行 对于文件夹 r 能够列 ...

  2. STL序列容器之vector

    一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...

  3. 显示dll里的QWidget

    1 新建库->C++库 2 命名(此处为mydll)并选择共享库--下一步--下一步 3 选择所需要的模块(有使用到的都选上)此处勾选前三项QtCore+QtGui+QtWidgets 4 完成 ...

  4. 我眼中的robot framework

    由于近期公司需要,需要一个测试框架对于公司的服务做自动化测试. 由于服务的复杂性,人工测试的方式越来越复杂,体现在以下方面: 1.人工测试步骤复杂,容易出错.服务的复杂性会使人工测试的准备工作,测试条 ...

  5. Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式

    引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...

  6. Information centric network (icn) node based on switch and network process using the node

    The present invention relates to an apparatus for supporting information centric networking. An info ...

  7. OpenGL(二十二) gluBuild2DMipmaps 加载Mip纹理贴图

    当纹理被用于渲染一个面积比它本身小很多的对象时,会由于纹理图像的降采样率不足而导致混叠现象,主要的表现特征是纹理图像的闪烁,出现纹理躁动.特别是在场景远近移动变换时,这种闪烁情况更为明显,严重可能会影 ...

  8. ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 静态文件 前几章节中,我们学习了 ASP.NET Core 的中间件 ...

  9. java程序设计第二课

    抽象基类和接口 能够使用keywordabstact来创建抽象类,该抽象类不能被实例化 也能够使用keywordabstact来描写叙述一个尚未被详细实现的方法,该方法不能包括方法体 一个抽象方法仅仅 ...

  10. C#操作EXCEL常见操作集合(行高,列宽,合并单元格,单元格边框线)

    private _Workbook _workBook = null; private Worksheet _workSheet = null; private Excel.Application _ ...