深入理解final关键字
来源:互联网 发布:时代中安网络 编辑:程序博客网 时间:2024/06/13 07:56
在Java中,final关键字可以用来修饰数据、方法、参数、类,下面我们来了解final的关键字的用法。
基本用法
final 数据
对于基本类型,final使数值恒定不变;而对用对象引用,final使引用恒定不变。
final修饰的基本类型,一旦被初始化后,不能再被赋值。
final修饰的对象引用,一旦引用被初始化指向一个对象,就无法再把它改为指向另外一个对象。
final 类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。
final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
final 方法
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。
public class Person { *** public final void doSwim() { } ***}![这里写图片描述](http://img.blog.csdn.net/20161016140636177)
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
final 参数
使用final修饰方法的参数,若参数为基本类型,该参数不能在方法中修改其值。若参数为对象应用,该参数在方法中不能修改其指向引用。
深入理解final
空final
class Reapeat { private final int a = 10; private final int b; public Reapeat(int b) { this.b = b; } }
所谓的”空白final”是指被声明的为final但又为给定初值的对象引用或者基本数据。无论在什么情况下,编译器都会去确保final在使用前必须被初始化。若不进行初始化,会提示错误,如下:
意味着,必须在域的定义处或者每个构造器中使用表达式对final进行赋值,这正是final域在使用前被初始化的原因所在。
final和static
public class FinalData { private static Random random = new Random(47); public final int v_1 = random.nextInt(20); public final static int v_2 = random.nextInt(20);}public class TestFinal { public static void main(String[] args) { FinalData fd_1 = new FinalData(); FinalData fd_2 = new FinalData(); System.out.println("v_1 = " + fd_1.v_1 + " | v_2 = " + FinalData.v_2); System.out.println("v_1 = " + fd_2.v_1 + " | v_2 = " + FinalData.v_2); }}// Logv_1 = 15 | v_2 = 18v_1 = 13 | v_2 = 18
从上述代码可以看出,final将数值定义为静态和非静态的区别。在fd_1和fd_2中,v_1的值都是唯一的,而v_2的值是一致的,并没有因为对象的创建而加以改变,因为其被static修饰,意味着在装载时已被初始化,而不是每次创建新对象时都初始化。
final和对象引用
我们已经了解到,如果使用final修饰了引用对象,引用对象被初始化后,不能再被指向另外一个对象,但是其内部的内容是否可以修改?
final Person person = new Person("li", 20);person.setName("wang");person.setAge(40);System.out.println(person.toString());// Log打印Person{name='wang', age=40}
从上述代码,person对象被final修饰,同时初始化为name = “li”,age=”20”。然后调用其相应setXX()方法修改其值。从Log打印看出,person对象自身的成员值为修改后的值。意味着被final修饰的对象引用,只是对象的应用不能修改,但是其自身却是可以修改的。
final和private
类中所有的private方法都隐式的指定为final的,由于无法取用private方法,所以也就无法覆盖它,可以对private方法添加final修饰符,但并没有添加任何额外意义。
private final void doSwim() {}
“覆盖”即重写只有在某方法是基类的接口的一部分时才会出现,即必须将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类接口的一部分,只不过是具有相同名称的方法而已。
- 深入理解 final 关键字
- 深入理解final关键字
- 深入理解final关键字
- 深入理解final关键字
- 深入理解final关键字
- final关键字的深入理解
- java final关键字深入理解
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 深入理解Java中的final关键字
- 简单说说Java SE、Java EE、Java ME三者之间的区别
- js时间转换
- Fiddler使用教程
- perl mojo use utf8 和no utf8
- Mac + tomcat 8.5.11 配置CGI
- 深入理解final关键字
- 在 VC6 中使用 GdiPlus-安装
- 数据库(2) SQL查询--简单查询
- 我的软件工程课目标
- 关于servlet调用doGet或者doPost以后报405的问题
- Android面试题汇总
- try catch finally的执行顺序(最有说服力的总结,你被坑了吗)
- JavaScript之删除数组中重复元素的方法
- Java内存分配之堆、栈和常量池