final关键字与宏变量

本文详细介绍了Java中的final关键字,包括final修饰的变量、方法和类的特性。重点解析了final变量作为宏变量的概念,强调了final变量在构造器中赋值后在编译期间可进行宏替换,从而提高效率。同时,通过实例分析了final实例变量和类变量的初始化时机以及宏替换的过程,展示了final关键字在防止意外修改和提升代码效率方面的作用。
摘要由CSDN通过智能技术生成

final关键字与宏变量

final关键字语法

  • 被final修饰的变量不能轻易被改变(无论是成员变量还是局部变量),又被称之为常量。
  • 被final修饰的方法不能被重写。
  • 被final修饰的类不能被继承。(不允许扩充)
final修饰的变量
被final修饰的实例变量必须显式指定初始值
  • 定义final变量时指定初始值
  • 在非静态代码块中指定初始值
  • 在构造器中指定初始值
    在这里插入图片描述
    注意:如果没有在代码块和构造器中未age和height变量赋值,否则,本质上,final变量只能在构造其中被赋初值。
被final修饰的类变量同样必须显示指定初值
  • 在定义时指定初值
  • 在静态代码块中指定初值
  • 本质上,final变量只能在静态代码块中指定初值
final与宏变量

final修饰符的一个重要作用就是定义“宏变量”,当定义final变量时就指定了初始值,而且该初始值在编译时就可以确定下来,那么这个变量是宏变量
在这里插入图片描述
在这里插入图片描述
如上图所示,两个输出语句的结果都是17.2,那么,price对象执行Price方法时,是如何得到initPrice的值呢?
显然,对于上面的Price类而言,由于使用了final关键字来修饰initPrice,所以initPrice本质上已经不再是变量,而是一个宏变量,相当于一个直接量,在Price的构造器中执行代码时,程序会直接把initPrice替换成20.

宏替换

对于final实例变量而言,可以在三个地方对其进行显式初始化,而只有在定义该变量时指定初始值才会有”宏变量“的效果,执行”宏替换“。
在这里插入图片描述
运行结果如下图:
在这里插入图片描述
在上面的代码中,str1在定义时赋值。str2在静态代码块中被赋值。

第一次会输出false,第二次会输出true。在第一次比较中,是将两个字符串变量的内容相连接,这里的str1是变量。通俗来讲:当程序每次执行到“str1+ str1”时,机器并不确定str1到底是什么内容,所以在编译时,会内存中为str1开辟了一块新的存储空间,然后将str1和str1计算的和赋值给结果所指向的对象。虽然两者所指向的内容相同,但是存储的地址却不同,所以,第一次的输出结果为false。

因为在第二次比较中,直接将两个字符串连接。在java中,字符串本身就可以理解为宏常量,这里要注意,是本身而不是字符串变量,也就是““ Java”已经是定死的了,不会再改变。在程序编译时,java直接将两个字符串连接成“javajava”,然后在常量池中寻找值为“javajava”的地址,并将寻找到的地址与“javajava”比较,所以,第二次的输出结果为true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值