首页 > 其他分享 >【final 关键字的理解】

【final 关键字的理解】

时间:2024-07-18 09:55:43浏览次数:22  
标签:变量 修改 代码 Object 关键字 理解 修饰 final


final关键字

final关键字主要作用为防止数据被修改,保证代码安全。

可以用于修饰:类中方法变量参数;

修饰类

相关代码
 代码解读final class Person {
}

// 错误,不可以继承被final修饰的类
class Student extends Person {
}

概念

当使用final关键字修饰类的时候,表示该类不可以被继承,类中所有方法默认均为final

final修饰类可以防止被继承,如jdk代码中的String类就是被final修饰的,从而防止被其他类继承,导致内部逻辑被破坏。

修饰类中方法

代码

 代码解读class Person {
    // 禁止子类重写该方法,修改其含义
    final String getIdentity() {
        return "I am a person!";
    }
}

class Student extends Person {
    // 错误,禁止重写父类的该方法
    @Override
    final String getIdentity() {
        return "I am a Student!";
    }
}

概念

当我们不希望子类重写父类的方法,修改父类该方法的定义时可以使用final修饰。

这样任何子类都不可以重写父类的该方法。

修饰变量

代码

 代码解读public static void main(String[] args) {
    final int num;
    final Object o;
    num = 10;
    o = new Object();

    // 下边两行是错误的
    num = 20;
    o = new Object();
}
 代码解读public class Test {
   // 类中的final成员变量必须在构造器中进行初始化
   private final Object object;
   
   public Test() {
       this.object = new Object();
   }
   
   // 错误,被final修饰的成员变量必须确保类中的构造器执行后,该变量完成初始化!!!
   public Test(Object object) {
   }
}

概念

当我们使用final关键字对变量进行修饰的时候。

  1. 当修饰的变量为内置类型时,一但完成初始化后,该变量的不可以进行修改。
  2. 当修饰的变量为引用类型时,一但完成初始化后,该变量中的对象引用不会指向其他对象,但可以修改对象内部的内容。
  3. 当我们用final修饰成员变量时,必须确保类中的构造器执行后,该变量完成初始化 用final修饰变量可以防止数据被修改,保证安全。

修饰参数

代码

 代码解读public void testInnerType(final int num) {
    num = 10; // error: Cannot assign a value to final variable 'num';
}

public void testObject(final Object o) {
    o = new Object(); // error: Cannot assign a value to final variable 'o';
}

概念

final修饰参数虽然可以做到参数不被修改,这么做并无任何意义。

java中的内置类型作为参数为值拷贝,用final修饰参数保证了形参不会被修改,并不能保证实参被修改。

java中的引用类型作为参数为引用拷贝,相当于增加一个引用指向实参所指向的对象,用final修饰参数保证了形参不会修改其指向的对象,并不能保证实参被修改。

因此,使用final修饰参数,并不能做到防止实参被修改,因此不需要在参数处加final。如需要形参不被该方法修改,才需要使用final修饰。

标签:变量,修改,代码,Object,关键字,理解,修饰,final
From: https://blog.csdn.net/m0_50116974/article/details/140514366

相关文章

  • 解锁AI潜能:fabric,你的智能助手,让AI理解你的需求
    探索AI新境界:fabric——你的智能助手在这个人工智能飞速发展的时代,我们每天都在见证着技术的革新。但你是否曾感到困惑,如何让这些看似冷冰冰的AI真正理解我们的需求,为我们提供帮助?今天,我要向大家介绍一款名为fabric的神器,它将彻底改变你与AI的互动方式!1.什么是fabric?fabric......
  • linux进程——父子进程层面的PID,fork的原理与理解
        前言:本篇内容主要讲解进程中系统调用fork和父子进程的概念与原理,想要系统学习linux进程的友友们只管看本篇文章是不行的。还要学习一些linux进程的周边知识以及linux进程其他方面的知识,博主的linux专栏中已经加入了这些文章方便友友们进行学习。感兴趣或者想要......
  • 【AI原理解析】—生成对抗网络(GAN)原理
    目录一、基本原理二、核心算法原理和数学模型三、训练过程四、GAN的优缺点生成对抗网络(GenerativeAdversarialNetwork,简称GAN)是一种深度学习模型,自2014年由IanGoodfellow等人提出以来,在人工智能领域得到了广泛应用。GAN的基本原理是通过两个神经网络——生成器(Genera......
  • 知识图谱与LLMs:实时图分析(通过其关系的上下文理解数据点)
    大型语言模型(LLM)极大地改变了普通人获取数据的方式。不到一年前,访问公司数据需要具备技术技能,包括熟练掌握各种仪表板工具,甚至深入研究数据库查询语言的复杂性。然而,随着ChatGPT等LLM的兴起,随着所谓的检索增强型LLM应用程序的兴起,隐藏在私人数据库中或可通过各种AP......
  • 【Java21】final修饰符
    final可以用来修饰类、变量和方法。类似C++里的const,表示被修饰的类、变量和方法不可改变。具体表现为:对变量,一旦初始化之后就不可改变。final即可修饰成员变量(类变量|实例变量),也可修饰局部变量、形参。final修饰的变量并不是不能赋值,而是不能被重新赋值。一旦获得初始值......
  • 如何从浅入深理解 Transformer
    如何从浅入深理解 Transformer附赠自动驾驶最全的学习资料和量产经验:链接本回答分为三个部分:Transformer,Attention,论文学习顺序按照排列顺序,不过还是看个人自由。如果对attention了解,就可以跳过。AttentionAttention based model 是什么,它解决了什么问题?深度学......
  • 大语言模型无法理解链表 Large Language Models Fails to Understand Chained Table[u
    大模型可以翻转链表,但是只能翻转单个元素链表。一但牵扯到分组操作,就不会了。Case:以K个元素为一组位翻转链表,每一组内部元素顺序不变。ReversethechainedtableingroupofKelements,don'tchangetheorderineachgroup. Handwritten: 1classNode():2......
  • Hive自定义函数编写方法(含源代码解读,超详细,易理解)
    一、Hive自定义函数介绍        1.内置函数        Hive自带了一些函数。比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。2.自定义函数        当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UD......
  • C#中implicit 关键字的使用:隐式转换操作符
    在C#中,implicit 关键字用于定义隐式转换操作符。隐式转换操作符允许自动将一种数据类型转换为另一种类型,而无需显式地调用转换方法或进行类型转换。下面将详细介绍 implicit 关键字的定义和使用。1.隐式转换操作符定义隐式转换操作符可以定义在一个类或结构体中,使得该......
  • 【Azure Developer】C#/.NET 静态函数中this关键字的作用
    问题描述在查看.NET代码的时候,发现一个静态方法,第一个参数使用this关键字,它在这里是什么作用呢?publicstaticXElementAquireElement(thisXContainercontainer,stringname,booladdFirst=false){... 问题解答通过查看微软的官方博文介......