Java final 修饰符
来源:才华咖 本文已影响2.32W人
来源:才华咖 本文已影响2.32W人
导语: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代码中在编译期某些变量能够直接被其本身的值所替换,编译到s文件中。因此,编译后的s文件中已经不存在此变了。
在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 }
英语作文International Day of Peace Vigil
初中英语作文:Jim Lambert’s vacation plans
win7系统重装win10提示not a valid image file
A Lifeguard at Johns Beach Saved a Drowning Child,A Lifeguar英语作文
java的String=a; a==null和a.equals(null)这两个判断有什么区别
java如何利用java.net.URLConnection发送HTTP请求
A Fairy Tale in Fall作文点评
Java中通过final关键字面向对象的详解
Java语言4种访问权限修饰符
关于Java 的修饰符
Java中final关键字用法的讲解
讲解Java编程中finally语句的使用方法
Java语言中修饰符的基础知识
Liu Xiang in a TV Commercial Film英语美文
Java中finally的问题
解析Java中volatile关键字
装饰装修合同二
描写My favourite animal英语作文
My favourite animal 英语作文
My favorite animal初中英语作文
whats your plan for dragon boat festival英语作文
Java语言接口interface
初二英语作文My Favorite Animal
Spring Festival is My Favorite Festival英语作文
my favourite animal英语作文
Spring Festival Gala初中英语作文
话题作文My favourite animal
My Favourite Animal初中英语作文
JAVA认证开源技术:关于Java的对象equals方法
My Favourite Animal英语写作范文
使用JavaScript实现Java的List功能
英译汉文章Life in a violin Case双语阅读
Java语言4种访问权限修饰符
简历的修饰
英语作文my favorite animal
Java类库及其组织结构(Java API)
装饰修改协议书
Java的访问修饰符与变量的作用
Java基本语法—java标识符
My favorite animals英语作文