java中修饰符final可以分别作用于类,方法和域。
final类。定义类的时候加上final修饰符,表明该类已经是相当完善了,不用也不能被其它类所继承,也就是说,该类在java的继承树结构中是一个叶节点。当一个类为final类时,该类的所有方法均自动成为final方法,不管你是否在方法前面加上修饰符final。而该类中的域可以通过加上final将其声明为一个final变量,也可以不加,声明为一般变量。一个类是否为final类,对该类的域是不产生任何影响的。
final方法。方法加上修饰符final可以将方法声明为一个final方法。final方法的作用有两个:其一,使该方法不能被子类覆盖或者改写。其二,提示编译器把对此方法的调用方式改成内联调用的方式,以提高执行效率。必须注意的是,如果final方法的方法体很大,此举会大大增加最终代码的体积,因此使用的时候要权衡二者的利弊。
final域。final域一旦赋值后将永远不变,因此非常适合用来定义常量。值得注意的是:如果final域是一个基本类型,那么表明改域的值是不能改变的。若final域是一个对象的引用,则仅仅表明改引用不能被改变,也就是永远指向同一个对象,但是被引用的对象自身却是可以改变的。这跟c++中的常量指针很像(不是指向常量的指针)。初始化final域有着特殊的要求:非静态final域要求在构造函数执行后必须被明确赋值,而静态final域在类初始化完成后必须要被明确赋值。看下面的例子:
class Parent{
final int i; //blank final
final int j = 10;
static final int k; //static blank final
static final int l = 20;
int z = 11;
static{
k = 15;
}
Parent(){
i = 5;
}
/*或者使用instance initializer
{
i = 5;
}*/
}
特别地,对于static final域,java的编译器会进行特殊的处理,将它们直接解析成对常量的本地拷贝,放置到引用者类的常量池或者字节码流中。当引用者类用到该数据时,会直接在本类的class文件的常量池或者字节码中取得,而不会去定义改域的类的class文件中取该数据。
final参数。c++的程序员要注意了,下面方法的声明不是表明Parent 对象不可变化,仅仅是表明改引用是不可改变的。如果直接将java的final类比成c++中的const关键字是不对的。
public void use(final Parent p){
p.z = 15; //correct
//p = new Parent(); error
}
其实,它更类似于c++中的常量指针,而不是指向常量的指针,这跟final域所说明的是保持一致的。
reference:
The Final Word On the final Keyword
http://renaud.waldura.com/doc/java/final-keyword.shtml
分享到:
相关推荐
DTD元素的修饰符DTD元素的修饰符DTD元素的修饰符DTD元素的修饰符DTD元素的修饰符DTD元素的修饰符
C#基础知识,学习必经之路,各个访问修饰符的作用、区别和联系
也是通过查阅网上资料,初略的整理了一下,(包含了final、static、abstract和访问修饰符public、protect、default、private)写成规范文档希望对有需要的提供些帮助
Java 访问修饰符 public protected private
权限修饰符的使用位置
C# 访问修饰符 比较
类修饰符,用于对类的特性类修饰符
父子类可以是不同包 在不同包下面只有public 与 protected 可以访问,而且protected必须是在继承关系下才能够访问
C语言中的类型修饰符说明,简单的资料,应该有点用
java代码-日常练习41,修饰符final
该文件主要是测试初学者对java三个修饰符的理解是否完善,能很好的测试出测试者是否对三个java三个修饰符有很好的理解。
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。 extern:修饰符:修饰变量,...
final修饰符与类型转化 类型转换是java编程中比较常见的一种操作,特别是基本数据类型之间的转换,如long型转化为int型,int转化为long等等。 类型的转化可以分成两类:强制转化与自动转化,例如long i=1;这个就叫...
JAVA_的主要五大修饰符的使用详解,按照类修饰符、字段修饰符、方法修饰符分别讲解。由于当时本人学习java时在理解这五个修饰符时花了不少时间,故上传此资源以帮助需要的人。
Java和C# 中访问修饰符 及其对比说明
C++储存类型修饰符
比较详细的介绍Java修饰符即及别,这是我把网络上以及自己比较的东西加以整合总计的,希望对Java触及爱好者有所帮助!
第6章 Java语言中的修饰符.ppt 第6章 Java语言中的修饰符.ppt
之前关于vue事件修饰符和按键修饰符的一点分析,最近需要回顾,就顺便发到随笔上了 在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现...
public private protest super final abstract this 等用法