Java-Final关键字

【JAVA】final关键字 在默认情况下,所有的成员变量和成员方法都可以被子类重写。如果父类的成员不希望被子类重写,可以在声明父类成员时使用final关键字修饰。final有“最终”“不可更改”的含义。在Java中,可以使用final关键字修饰类、属性、方法。 阅读详情

Java-Final关键字

Final成员变量

final修饰的成员变量必须由程序员显式的指定初始值

final修饰的类变量:

  • 静态初始块中指定初始值或者声明该变量时指定初始值

  • 而且只能在两个地方的其中之一指定

final修饰的实例变量:

  • 非静态初始块,声明该实例变量或构造函数中指定初始值

  • 只能在三个中的一个指定

实例变量不能在静态初始块中指定初始值,因为静态初始块是静态成员,不可访问实例变量—非静态成员

类变量不能在普通初始块中指定初始值,因为类变量在类初始化阶段已经被初始化了

public class FinalVariableTest {

    // 定义成员变量时指定默认值,合法。
    final int a = 6;
    // 下面变量将在构造器或初始化块中分配初始值
    final String str;
    final int c;
    final static double d;
    // 既没有指定默认值,又没有在初始化块、构造器中指定初始值,
    // 下面定义的ch实例变量是不合法的。
    // final char ch;
    // 初始化块,可对没有指定默认值的实例变量指定初始值
    {
        //在初始化块中为实例变量指定初始值,合法
        str = "Hello";
        // 定义a实例变量时已经指定了默认值,
        // 不能为a重新赋值,因此下面赋值语句非法
        // a = 9;
    }
    // 静态初始化块,可对没有指定默认值的类变量指定初始值
    static
    {
        // 在静态初始化块中为类变量指定初始值,合法
        d = 5.6;
    }
    // 构造器,可对既没有指定默认值、有没有在初始化块中
    // 指定初始值的实例变量指定初始值
    public FinalVariableTest()
    {
        // 如果在初始化块中已经对str指定了初始化值,
        // 构造器中不能对final变量重新赋值,下面赋值语句非法
        // str = "java";
        c = 5;
    }
    public void changeFinal()
    {
        // 普通方法不能为final修饰的成员变量赋值
        // d = 1.2;
        // 不能在普通方法中为final成员变量指定初始值
        // ch = 'a';
    }
    public static void main(String[] args)
    {
        FinalVariableTest ft = new FinalVariableTest();
        System.out.println(ft.a);
        System.out.println(ft.c);
        System.out.println(ft.d);
    }


}


假如打算在构造函数中,初始块中对final成员变量进行初始化,则不应在初始化之前直接访问final成员变量

但Java又允许通过方法来访问final成员变量,此时系统就会帮你将final成员变量进行默认初始化

public class FinalErrorTest {

    // 定义一个final修饰的实例变量
    // 系统不会对final成员变量进行默认初始化
    final int age;
    {
        // age没有初始化,所以此处代码将引起错误。
//		System.out.println(age);
        printAge();
        age = 6;
        System.out.println(age);
    }
    public void printAge(){
        System.out.println(age);
    }
    public static void main(String[] args)
    {
        new FinalErrorTest();
    }

    
}

final成员变量在显式初始化之前不能直接访问,但又可以通过方法来访问,这可能是Java设计的一个缺陷

final局部变量

系统不会对局部变量进行初始化,必须程序员自己进行显式初始化

所以用final修饰局部变量,可以在定义同时指定初始值,也可以不指定

  • 如果定义时没有指定初始值,可以在后面进行初始化,但只能进行一次

  • 如果定义时已经指定初始值,后面就不能再赋值


public class FinalLocalVariableTest {

    public void test(final int a)
    {
        // 不能对final修饰的形参赋值,下面语句非法
        // a = 5;
    }
    public static void main(String[] args)
    {
        // 定义final局部变量时指定默认值,则str变量无法重新赋值
        final String str = "hello";
        // 下面赋值语句非法
        // str = "Java";
        // 定义final局部变量时没有指定默认值,则d变量可被赋值一次
        final double d;
        // 第一次赋初始值,成功
        d = 5.6;
        // 对final变量重复赋值,下面语句非法
        // d = 3.4;
    }

    
}

final修饰基本类型变量和引用类型变量

  • final修饰基本类型变量,不能对该变量重新赋值

  • final修饰引用类型变量,final只保证这个变量所引用的地址不变,即一直引用同一个对象,但是这个对象是可以改变的

class Person
{
    private int age;
    public Person(){}
    // 有参数的构造器
    public Person(int age)
    {
        this.age = age;
    }
    // 省略age的setter和getter方法
    // age的setter和getter方法
    public void setAge(int age)
    {
        this.age = age;
    }
    public int getAge()
    {
        return this.age;
    }
}
public class FinalReferenceTest
{
    public static void main(String[] args)
    {
        // final修饰数组变量,iArr是一个引用变量
        final int[] iArr = {5, 6, 12, 9};
        System.out.println(Arrays.toString(iArr));
        // 对数组元素进行排序,合法
        Arrays.sort(iArr);
        System.out.println(Arrays.toString(iArr));
        // 对数组元素赋值,合法
        iArr[2] = -8;
        System.out.println(Arrays.toString(iArr));
        // 下面语句对iArr重新赋值,非法
        // iArr = null;
        // final修饰Person变量,p是一个引用变量
        final Person p = new Person(45);
        // 改变Person对象的age实例变量,合法
        p.setAge(23);
        System.out.println(p.getAge());
        // 下面语句对p重新赋值,非法
        // p = null;
    }
}


"宏替换"final变量

当变量满足三个条件时,这个final变量就不再是一个变量,而是一个直接量:

  • final修饰符修饰

  • 在定义时就指定了初始值

  • 该初始值可以在编译时就被确定

public class FinalLocalTest {

    public static void main(String[] args) {
        final int a = 5;

        System.out.println(a);
    }
}

System.out.println(a)语句实际上是直接执行 System.out.println(5)

如果被赋值的表达式只是基本的算术表达式或字符串连接操作,没有访问普通变量以及调用方法,Java编译器同样将这种final变量当做“宏变量”处理


public class FinalReplaceTest {


    public static void main(String[] args)
    {
        // 下面定义了4个final“宏变量”
        final int a = 5 + 2;
        final double b = 1.2 / 3;
        final String str = "leran" + "Java";
        final String book = "Java" + 99.0;
        // 下面的book2变量的值因为调用了方法,所以无法在编译时被确定下来
        final String book2 = "Java" + String.valueOf(99.0);  //①
        System.out.println(book == "Java99.0");
        System.out.println(book2 == "Java99.0");
    }


}

再看一个例子:

public class StringJoinTest {

    public static void main(String[] args)
    {
        String s1 = "LJava";
        // s2变量引用的字符串可以编译时就确定出来,
        // 因此s2直接引用常量池中已有的"LJava"字符串
        String s2 = "L" + "Java";
        System.out.println(s1 == s2); // 输出true
        // 定义2个字符串直接量
        String str1 = "L";     //①
        String str2 = "Java";     //②
        // 将str1和str2进行连接运算
        String s3 = str1 + str2;
        System.out.println(s1 == s3); // 输出false
    }
}

final方法

final修饰的方法不可重写

public class FinalMethodTest
{
    public final void test(){}
}
class Sub extends FinalMethodTest
{
    // 下面方法定义将出现编译错误,不能重写final方法
//    public void test(){}
}

final类

final修饰的类不可以有子类

【UE5】【蓝图】 LevelSequence 动画播放与暂停 最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。 阅读详情

相关推荐

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

Educoder–Java 第1关:学习-Java继承和多态之final关键字

文章目录任务描述相关知识final 关键字的使用final 关键字修饰类、成员变量和成员方法编程要求测试说明答案 任务描述 本关任务:调试代码,对代码进行增添、删除和修改等操作,使得程序能够正常运行,输出结果请参照预期输出结果。 相关知识 为了完成本关任务,你需要掌握:1. final关键字的使用; 2. final 关键字修饰类、成员变量和成员方法。 final 关键字的使用 在 Java 中声明类、属性和方法时,可使用关键字 final 来修饰。 final 标记的类不能被继承; final 标记的方

Gilgamesh的博客 3079

STM32驱动四位共阳极数码管实现高精度秒表计时器

本文详细介绍了如何使用STM32驱动四位共阳极数码管实现高精度秒表计时器。项目基于STM32F103C8T6最小系统板,通过定时器中断和GPIO控制,实现0.1秒精度的计时功能,并解析了共阳极数码管的动态扫描原理及按键消抖等关键技术。

n8m7b6v5c4的博客 951

EduCoder-Java面向对象(第二章) - 封装、继承和多态的实现代码(关卡五-关卡八)

目录 第五关 第五关答案 第六关 第六关答案 第七关 第七关答案 第八关 第八关答案 第五关 抽象类/span> 任务描述 本关任务:掌握抽象类的定义及用法。 相关知识 为了完成本关任务,你需要掌握:1.抽象类的概念;2.如何定义抽象类。 抽象类的概念 前面对类的继承进行了初步的讲解。通过继承,可以从原有的类派生出新的类。原有的类称为基类或父类,而新的类则称为...

小康小白的博客 1万+

从RRT到平滑轨迹:机械臂避障规划仿真全流程解析

本文详细解析了机械臂避障规划从RRT算法到平滑轨迹优化的全流程,包括MATLAB实现、碰撞检测工程实践及轨迹平滑优化技巧。通过RRT算法在关节空间的路径搜索与Minimum Jerk/Snap优化,实现机械臂在复杂环境中的高效安全运动,适用于工业自动化与机器人控制领域。

weixin_29051811的博客 294

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 486

java中final关键字

final final是java语言中的一个关键字 final表示最终的,不可变的。 final可以修饰变量以及方法,还有类等。 final修饰的类(无法被继承) final class A{ //A 是没有子孙的 } class B extends A{ //错误的, 无法从最终类A进行继承 //B类继承A类 相当于对A类功能进行扩展 //如果不希望别人对A类进行扩展,可以给A类加final关键字,如String类 } final修饰的方法(无法被覆盖,重

MTCya的博客 3万+

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。

TxNet 1751

java final 关键字

java的final关键字详解

tuoniaoxs的博客 3万+

vue2/3 - 详细实现内网使用离线高德地图功能,在vue中无需网络离线使用高德地图相关功能,高德地图如何离线加载详细教程(内网部署及使用),提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制

vue,vue2,vue3,高德地图,离线使用高德地图,高德地图瓦片官方下载,vue内网使用高德地图离线无网络,断网情况下使用高德地图,vue离线高德地图教程,如何实现内网部署高德地图,无需联网离线使用,vue+ts实现离线高德地图 内网离线高德地图,如何在高德地图Vue项目中下载离线地图,高德离线地图加载不出来,高德地图离线使用不显示怎么办,怎么解决vue内网使用离线高德地图加载失败问题,vue实现离线地图+高德瓦片,vue引入高德离线地图,vue项目如何使用离线高德地图和自定义地图样式,高德离线地图的下

✅ 精选推荐文章 1万+

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2146

Java final关键字

总之,Java 中的final关键字是一个功能强大的工具,具有优点和缺点。它在不可变性、定义算法结构、提供代码清晰度、确保安全性和稳定性、线程安全、以及保护遗留代码等方面起着重要作用。尽管存在一些缺点,如测试和调试的帮助较少、动态性较低、灵活性有限,这些问题可能会使程序的执行更加复杂。然而,如果我们更多地关注其积极的一面而非缺点,我们可以看到final关键字在限制继承、保持值的恒定性以及防止更改和修改方面的重要性。

疯一样的码农 1296

YOLOv8改进,YOLOv8添加DCNv3可变性卷积,无需编译

DCNv3在DCNv2版本上进行了改进,上一期我们在YOLOv8中添加了DCNv2,这一期我们将添加DCNv3,DCNv3代码详解可以参考链接:代码详解——可变形卷积(DCNv3)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5021

Java中的final关键字

在java中可以将实例域定义为final。在构建对象是必须初始化这样的值。必须确保在每个构造器执行之后,这个域的值被设置,并且在后面的操作中不再对其修改。使用final声明变量之后,这个值就不能修改,一般final类型的变量都被声明为静态变量,而且是公有类型的,它在内存中被放在一个特有的公共区域。 也就是说,在Java语法中规定,final修饰的成员变量必须有程序员显式地指定初始值。 定义格式...

IBLiplus的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java-final关键字详解

final使用final关键字定义常量,使得这些值在程序运行期间保持不变。

边走、边悟、迟早变好 1418

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java基础之final关键字详解

       final在Java中可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,如果你试图将变量再次初始化的话,编译器会报编译错误。        final的含义在不同的场景下有细微的差别,但总体来说,它指的

MyKelly_2013 1684

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

有关Java中关键字final的理解

一、final数据在java编程语言中,有时候需要告知编译器一段数据是不变的编译期常量。对于这种情况,编译器可以将此常量值带入需要用到它的计算式子当中,这种在编译时执行计算式的方法减轻了运行时的开销。通常,这类常量数据都是基本类型的数据,并赋予关键字final,同时在对此常量定义时需要进行赋值。值得注意的是:对于基本类型,使用final关键字将使数值恒定不变;而对于对象引用,final则是

scuhank的专栏 1万+

java关键字之final

java关键字之final 学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:543120397 我们一起学Java!

u014344668的专栏 359

详解Java中的final关键字

文章目录final 简介[^1]final 修饰变量final 修饰类final 修饰方法final 优化编码的艺术 final 简介1 final关键字可用于多个场景,且在不同场景具有不同的作用。首先,final是一个非访问修饰符,仅适用于变量,方法或类。下面是使用final的不同场景: 上面这张图可以概括成: 当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实...

Heriam的博客 1074

java中static关键字和final关键字

原文地址:http://www.cnblogs.com/dolphin0520/p/3736238.html 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下面是本文的目录大纲:   一.final关键字的基本用法   二.深入理解f

众智成程的专栏 1804

java中final double_举例讲解Java中final关键字的用法

1. final variablefinal variable 就是一个常量,一旦被初始化就不可以被改变。class Test1 {final double PI = 3.14; //常量的名称最好大写public Test1(){PI = 3.14;}void test(){System.out.println("PI is: " + PI);}public static void main(S...

weixin_42566121的博客 2513

Java之 final关键字

参考: http://baijiahao.baidu.com/s?id=1601084106055683243&wfr=spider&for=pc Java编程思想 final关键字的作用 在Java中,final关键字可以用来修饰成员函数,成员变量和类.。下面分别介绍。 1. final修饰数据 1.1 修饰类的成员变量 **当final修饰成员变量时,此时表示常量,说明该属性是只读的。**总得来说,final既可以修饰基本数据类型,也可以修饰对象引用。 1)**必须被显式初始化值,而且只

Chaolei3的博客 362

Java Final关键字示例

Java中的Final关键字是一个修饰符,用于限制用户执行不需要的代码或防止代码或值被更改。 可以在3个上下文中使用此关键字。 他们是: 最终关键字作为变量修饰符 最终关键字作为方法修饰符 Final关键字作为类修饰符 每个上下文都有其自身的意义和暗示的限制。 它们将在下面详细讨论。 1. FINAL关键字作为变量修饰符 每个上下文都有其自己的不同目的。 final ...

一名可爱的技术搬运工 324

java final关键字

java final关键字final关键字的含义是什么?final关键字的用法有哪些?final关键字具体怎么用? final关键字的含义是什么? final关键字通常指“这是无法改变的”。主要用于设计或者优化。但是随着java的发展,优化的功能基本无效了。 final关键字的用法有哪些? final数据:数据具有只读性。 final方法:方法不可被覆盖。(private方法隐含final效果)...

Imperial_Vmlion的博客 280
上一篇: Java多态
下一篇: Java-接口与抽象类
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值