首页 > 其他分享 >关于final关键字的几点疑惑和答案

关于final关键字的几点疑惑和答案

时间:2023-06-05 15:37:17浏览次数:24  
标签:初始化 变量 编译 关键字 修饰 几点 final String


问题:被final修饰的变量在内存中的位置?

问题:为什么被final修饰的变量必须进行立即初始化或者构造方法初始化?

问题:为什么局部变量必须要进行显示初始化?

问题:为什么方法内部类访问方法的局部变量时必须加final修饰符?


final从字面上理解含义为“最后的,最终的”。在Java中也同样表示出此种含义。

final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

1. final修饰类:

final修饰类即表示此类已经是“最后的、最终的”含义。因此,用final修饰的类不能被继承,即不能拥有自己的子类。

如果视图对一个已经用final修饰的类进行继承,在编译期间或发生错误。

 

2. final修饰方法:

final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。

此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,

将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是

在子类中重新定义了新的方法。



1 public class B extends A {
 2 
 3     public static void main(String[] args) {
 4 
 5     }
 6 
 7     public void getName() {
 8         
 9     }
10 }
11 
12 class A {
13 
14     /**
15      * 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
16      * 属于子类本身的方法,编译正常
17      */
18     private final void getName() {
19         
20     }
21 
22     /* 因为pblic修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
23     public final void getName() {
24     
25     }
26     */
27 }



 

3. final 修饰变量:

final修饰的变量表示此变量是“最后的、最终的”含义。一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。

这里需要注意以下几个问题:

1. final修饰的变量,无论是类属性、对象属性、形参还是局部变量,这些变量都是需要进行显示初始化(即为其显示指定初始值)。

对于final修饰的形参,由于是实参传递过来的,很好理解。

对于final修饰的局部变量,与未用final修饰的变量一样,都是需要显示初始化。即局部变量都是需要显示初始化的。

对于一般的类属性和对象属性,由类和对象的初始化过程中可以看出,首先都进行了默认初始化。然后对有显示赋值的变量才再进行显示初始化。

但对final修饰的类属性和对象属性而言,如果不显示初始化,其默认将是进行默认初始化后的值,这与final本身出发点矛盾,因此,Java语法规定:

final修饰的类属性和变量属性必须要进行显示初始化赋值。

另外,无论对于基本数据类型还是引用数据类型,final修饰的变量都是首次显示初始化后值都不能修改。对于基本数据类型,很好理解。对于引用

数据类型,引用变量指向的是实际的对象,但其存储的是所指向对象的地址,因此,其值不能修改并不意味着其所指向的对象不能修改。

 

4. final修饰变量后导致的“宏替换”/"宏变量"问题

Java 中宏变量/宏替换指的是在java代码中在编译期某些变量能够直接被其本身的值所替换,编译到.class文件中。因此,编译后的.class文件中已经不存在此变了。

在String类型的变量中,有时候经常遇到如下情况:



1 public class Test {
 2 
 3     public static void main(String[] args) {
 4 
 5         String country = "China";
 6         String name = "qqyumidi";
 7 
 8         String userInfo = country + name;  //编译后此处依然是country和name变量
 9         String user = "China" + "qqyumidi";  //编译后此处直接变成Chinaqqyumidi
10 
11     }
12 }



在上述代码中的第9行,编译后的变量结果直接为Chinaqqyumidi。而第8行代码中,由于country和name都是普通的变量,编译器无法在编译时直接确定userInfo的值,因此

此处编译后结果不直接是Chinaqqyumidi。

但是,如果希望第8行中的代码在编译期直接就能表示为Chinaqqyumidi,就需要用到final修饰符对country和name变量进行修饰。

原因:final修饰符修饰的变量在由于其本身的特性,在编译期就能直接确定其值,且此值不可变。在编译过程中,可以直接将其变量直接转换成其值本身去表示。



1 public class Test {
 2 
 3     public static void main(String[] args) {
 4 
 5         final String country = "China";
 6         final String name = "qqyumidi";
 7 
 8         String userInfo = country + name;  //编译后此处直接是Chianqqyumidi
 9 
10     }
11 }



 

标签:初始化,变量,编译,关键字,修饰,几点,final,String
From: https://blog.51cto.com/u_14121041/6416281

相关文章

  • 做好这几点,数据分析入门也不难
    是的,数据分析入门并不难,只需要具备一定的数学基础、编程技能和实践经验,再结合一些有效的学习方法和注意事项,就可以快速地掌握数据分析的基本概念和方法。以下是几个做好数据分析入门的关键点:建立数学和统计学基础数据分析离不开数学和统计学的基础知识,因此需要学习线性代数、微......
  • c++ explicit关键字
    explicit关键字用于修饰单参数构造函数(因为无参数构造函数和多参数构造函数总是显式调用,这种情况在构造函数前面加explicit毫无意义)和转换函数,用于禁止隐式类型转换作用是防止编译器在某些情况下自动执行隐式类型转换,以提高代码的明确性和安全性classA{public:A(int......
  • c++ volatile关键字
    volatile是关键字,用来修饰变量作用禁止编译器对变量的优化编译器在优化代码时,会对变量的读取和写入进行优化,例如将变量从内存加载到寄存器中进行操作,以提高执行效率,但是对于volatile修饰的变量,编译器不能进行这些优化,以确保对变量的每次读写操作都是直接从内存中进行的一......
  • volatile 关键字
    一、volatile关键字的适用与不适用场景1.什么是volatilevolatile是一种同步机制,类似于Lock和Synchronized,但是他更轻量级,因为使用volatile并不会发生上下文切换等开销很大的行为。如果一个变量被volatile修饰,那么JVM会认为这个变量可能会被并发修改,会保证关于这个变......
  • synchronized 关键字
    1.synchronized关键字的作用synchronized关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。2.作用范围修饰代码块:大括号括起来的代码,作用于调用的对象。修饰方法:整个方法,作用于调用的对象。修饰静......
  • python 仅关键字参数
    defstandard_arg(arg)defstandard_arg(arg):print(arg)standard_arg(2)standard_arg(arg=2)对参数没有限制defstandard_arg(arg,/)defstandard_arg(arg,/):print(arg)standard_arg(2)#正确standard_arg(arg=2)#报错仅限位置参数def stand......
  • 【电商api接口系列分享】按关键字搜索商品演示示例
     在电商平台中,关键词推荐是提高用户购物体验和销售业绩的一个重要手段。它的重要性体现在以下几个方面:提升购物体验:通过关键词推荐,电商平台可以根据用户的搜索意图和行为来向其推荐相关的商品。这样可以帮助用户更快地找到自己需要的商品,提高购物体验和满意度。增加销售......
  • C# 一些非常用关键字
    一、fixed 1、fixed语句禁止垃圾回收器重定位可移动的变量。fixed语句只能出现在不安全的上下文中。Fixed还可用于创建固定大小的缓冲区。2、fixed语句设置指向托管变量的指针并在statement执行期间“钉住”该变量。如果没有fixed语句,则指向可移动托管变量的指针的作用......
  • Day07-static关键字
    static关键字static修饰变量可直接被类名调用可被对象调用没有加static关键字时,无法直接被类名调用publicclassDemo01{  privatestaticintage;//静态的变量多线程!  privatedoublescore; //非静态的变量​  publicstaticvoidmain(String[]......
  • [C++学习]关键字
    const关键字const关键字表示该数据类型的值只读,不可赋值,也就意味着它必须初始化。const若是修饰常量,则只读变量的值会放在“符号常量表”中,而不会立即开辟空间,当数据取地址时则会开辟空间。constintdata=100;int*p=(int*)&data;//开辟空间,p指向该空间。*p=200......