Java 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代码中在编译期某些变量能够直接被其本身的值所替换,编译到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 }
-
Java基本元素详解
生活呆以是甜的,也可以是苦的,但不能是没味的。你可以胜利,也可以失败,但你不能屈服,以下是小编为大家搜索整理了Java基本元素详解,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!第二章基本元素第一章总结:一平台&JDK&JRE&JVM&A...
-
经典的Java main方法面试题10个
在java中,main()方法是java应用程序的入口方法。本文是本站小编搜索整理的关于经典的Javamain方法面试题10个,特别适合参加Java面试的朋友阅读,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!1.不用main方法如何定义一个类?不行,没有main方...
-
java的应用范围
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。自从sun公司推出java语言以来,java极大受到开发者和企业的欢迎,在互联网如此发达的今天,java语言得到了广泛的应用,比如网站,游戏,电子商务等,java语言在这些领域开发占很大的比例。在全球云计算和移动互...
-
关于java如何配置MyEclipse Maven环境具体方法
虽然我的大部分项目已经迁到Idea上去了,但是在写部分小的测试程序的时候还是习惯性的会点开MyEclipse。之前使用第三方库的时候我会习惯的下载jar包,然后buildpath导入,但是在idea中貌似通过配置maven依赖更方便,于是我在MyEclipse中也想使用来导入依赖,在尝试的过...
相关文章
- Java中Finally关键字
- Java中finally的问题
- java的String=a; a==null和a.equals(null)这两个判断有什么区别
- Java中通过final关键字面向对象的详解
- 讲解Java编程中finally语句的使用方法
- Java final 修饰符知识点总结范例
- java基础之final、finally和finalize的区别
- Java中final关键字用法的讲解
- JAVA认证基础知识:JavaNativeInterface学习小结
- A Lifeguard at Johns Beach Saved a Drowning Child,A Lifeguar英语作文