我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中如何使用final关键字

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中如何使用final关键字

Java中如何使用final关键字,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

 一.final关键字的基本用法

  在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。

  1.修饰类

  当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

Java中如何使用final关键字

  在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

  2.修饰方法

  下面这段话摘自《Java编程思想》第四版第143页:

  “使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

  因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。

  注:类的private方法会隐式地被指定为final方法。

  3.修饰变量

  修饰变量是final用得最多的地方,也是本文接下来要重点阐述的内容。首先了解一下final变量的基本语法:

  对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

  举个例子:

  Java中如何使用final关键字

  上面的一段代码中,对变量i和obj的重新赋值都报错了。

 二.深入理解final关键字

  在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方。

类的final变量和普通变量有什么区别?

  当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

  那么final变量和普通变量到底有何区别呢?下面请看一个例子:

public class Test {    public static void main(String[] args)  {        String a = "hello2";         final String b = "hello";        String d = "hello";        String c = b + 2;         String e = d + 2;        System.out.println((a == c));        System.out.println((a == e));    }}
true
false

  大家可以先想一下这道题的输出结果。为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。这种和C语言中的宏替换有点像。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的  值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化,比如下面的这段代码就不会进行优化:

public class Test {    public static void main(String[] args)  {        String a = "hello2";         final String b = getHello();        String c = b + 2;         System.out.println((a == c));     }         public static String getHello() {        return "hello";    }}

  这段代码的输出结果为false。

被final修饰的引用变量指向的对象内容可变吗?

  在上面提到被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子:

public class Test {    public static void main(String[] args)  {        final MyClass myClass = new MyClass();        System.out.println(++myClass.i);     }} class MyClass {    public int i = 0;}

  这段代码可以顺利编译通过并且有输出结果,输出结果为1。这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

final和static

  很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。看下面这个例子:

public class Test {    public static void main(String[] args)  {        MyClass myClass1 = new MyClass();        MyClass myClass2 = new MyClass();        System.out.println(myClass1.i);        System.out.println(myClass1.j);        System.out.println(myClass2.i);        System.out.println(myClass2.j);     }} class MyClass {    public final double i = Math.random();    public static double j = Math.random();}

  运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。

匿名内部类中使用的外部局部变量为什么只能是final变量?

  这个问题请参见上一篇博文中《Java内部类详解》中的解释,在此处不再赘述。

关于final参数的问题

  关于网上流传的”当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法外的变量“这句话,我个人理解这样说是不恰当的。

  因为无论参数是基本数据类型的变量还是引用类型的变量,使用final声明都不会达到上面所说的效果。

  看这个例子就清楚了:

Java中如何使用final关键字

  上面这段代码好像让人觉得用final修饰之后,就不能在方法中更改变量i的值了。殊不知,方法changeValue和main方法中的变量i根本就不是一个变量,因为java参数传递采用的是值传递,对于基本类型的变量,相当于直接将变量进行了拷贝。所以即使没有final修饰的情况下,在方法内部改变了变量i的值也不会影响方法外的i。

  再看下面这段代码:

public class Test {    public static void main(String[] args)  {        MyClass myClass = new MyClass();        StringBuffer buffer = new StringBuffer("hello");        myClass.changeValue(buffer);        System.out.println(buffer.toString());    }} class MyClass {         void changeValue(final StringBuffer buffer) {        buffer.append("world");    }}

  运行这段代码就会发现输出结果为 helloworld。很显然,用final进行修饰并没有阻止在changeValue中改变buffer指向的对象的内容。有人说假如把final去掉了,万一在changeValue中让buffer指向了其他对象怎么办。有这种想法的朋友可以自己动手写代码试一下这样的结果是什么,如果把final去掉了,然后在changeValue中让buffer指向了其他对象,也不会影响到main方法中的buffer,原因在于java采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

关于Java中如何使用final关键字问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中如何使用final关键字

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中如何使用final关键字

Java中如何使用final关键字,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 一.final关键字的基本用法  在Java中,final关键字可以用来修饰类、方法和变量
2023-06-19

Java中的final关键字如何使用

这篇文章主要讲解了“Java中的final关键字如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的final关键字如何使用”吧!一、final概述子类可以在父类的基础上改写父
2023-07-02

PHP中final关键字如何使用

今天就跟大家聊聊有关PHP中final关键字如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在PHP中类的继承是使用最多的一个编程特性,我们可以创建一个基类(父类)然后在这其中
2023-06-17

final与static关键字如何在Java中使用

本篇文章给大家分享的是有关final与static关键字如何在Java中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、final 根据程序上下文环境,Ja
2023-05-31

java中的final关键字怎么使用

在Java中,final关键字可以用于修饰类、方法和变量。1. final修饰类:final修饰的类是不可被继承的,即该类不能有子类。例如:```javafinal class MyClass {// 类的内容}```2. final修饰方
2023-08-24

java final关键字怎么使用

这篇文章主要介绍“java final关键字怎么使用”,在日常操作中,相信很多人在java final关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java final关键字怎么使用”的疑惑有所
2023-07-04

怎样用Java final 关键字

怎样用Java final 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面好好地讲一讲 final 关键字,也希望给更多的小伙伴一些帮助。尽管继承可以让我们重用现有代
2023-06-03

关于java中final关键字的使用方法详解

一、修饰类被final修饰的类不能被子类继承。//父类Animalpublic final class Animal{private int age; //年龄private String var; //品种 public void eat(){ Syst
关于java中final关键字的使用方法详解
2015-04-20

详解Java中的final关键字

子类可以在父类的基础上改写父类内容,为了避免这种随意改写的情况,Java提供了final关键字,用于修饰不可改变内容。本文就来详细说说final关键字的使用,需要的可以参考一下
2022-11-13

Java中final关键字和final的四种用法实例

final关键字代表最终的、不可改变的,下面这篇文章主要给大家介绍了关于Java中final关键字和final的四种用法实例,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
2023-02-06

Java中的Final关键字的用法介绍

这篇文章主要介绍“Java中的Final关键字的用法介绍”,在日常操作中,相信很多人在Java中的Final关键字的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Final关键字的用法介绍
2023-06-16

Java中final关键字的作用是什么

这篇文章主要讲解了“Java中final关键字的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中final关键字的作用是什么”吧!final关键字的作用final关键字可以
2023-06-20

php中final关键字的作用

final关键字在php中发挥以下作用:类声明:阻止类被继承;方法声明:阻止方法被覆盖;作用包括:增强安全性、提高性能、强制设计原则、避免不必要的继承。php中final关键字的作用final关键字在PHP中具有以下作用:1. 类声明
php中final关键字的作用
2024-04-27

Java中如何使用instanceof关键字

这篇“Java中如何使用instanceof关键字”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Java中如何使用instanceof关键字”,小编整理了以下知识点,请大家跟着小编的步伐一步一
2023-06-29

java中static关键字如何使用

java中static关键字如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。public class Parent { static { System
2023-06-20

java中throws关键字如何使用

在Java中,throws关键字用于在方法签名中声明可能抛出的异常。它用于告诉调用该方法的代码,该方法可能会抛出特定类型的异常,调用者需要在调用该方法时处理或进一步传递这些异常。throws关键字的使用方法如下:1. 在方法签名中使用thr
2023-09-12

深入浅析Java中的this、final关键字

这篇文章给大家介绍深入浅析Java中的this、final关键字,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。this关键字this引用对象自身。它也可以在构造方法内部用于调用同一个类的其他构造方法。 隐藏的静态变量可
2023-05-31

Java中的final关键字详解及实例

Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 如果修饰的是引用
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录