`

Java Final 总结

阅读更多
final表示“不可变的”或“终态的”,可以用在类、方法、变量上。


用在类上:表示该类不能被继承。
final不能用来修饰抽象类。原因显而易见:final类不能被继承,而抽象类应该被继承,这是矛盾的。
同理也不能用来修饰100%抽象的接口(interface)。

用在方法上:表示该方法不能被子类重写。
final不能用来修饰抽象方法。原因显而易见:final方法不能被子类重写,而抽象方法应该被子类重写(或子类亦声明为抽象类)。

用在变量上:表示该变量只能被赋值一次(JLS Def:A final variable may only be assigned to once)
因为只能赋值一次,所以一经赋值其就不会再改变。
因为final变量"不可变",对引用类型:引用(变量)reference存储的值就是其所指向的对象实例的Heap中地址,那么该引用(变量)就始终指向同一个对象实例(注意不是该final变量指向的对象的属性不可变!)。
变量声明中不包含赋值操作的final变量称为blank final。
做了初始化的基本类型或String类型的final变量,称为constant variables。


final成员变量有默认值(default value)吗?
成员变量如未初始化是有默认值的(编译器指定)(http://wuaner.iteye.com/admin/blogs/1666376),final成员变量也不例外。如下例:
引用
Src:http://www.coderanch.com/t/241783/java-programmer-SCJP/certification/help-blank-final-variables
public class FinalFieldsDefaultValue {

	final int someInt;
	final String someStr;
	
	{
		System.out.println(getSomeInt());
		System.out.println(getSomeStr());
	}

	int getSomeInt() {
		return someInt;
	}

	String getSomeStr() {
		return someStr;
	}

	FinalFieldsDefaultValue() {
		someInt = 2;
		someStr = "abc";
		System.out.println(someInt);
		System.out.println(someStr);
	}

	public static void main(String[] args) {
		new FinalFieldsDefaultValue();
	}  

}
Output:
0
null
2
abc

final成员变量存在默认值(说明编译器对其做了隐式的赋值操作),而我们又可以对其做一次(只能是一次)赋值操作,这似乎与JLS中final变量的定义(A final variable may only be assigned to once)矛盾,我们只能这样认为:JLS中final变量的定义不够严格,应该加上并着重强调显式(explicitly/definitely)二字:
A final variable may only be explicitly assigned to once


final成员变量必须显式赋值
正是因为final成员变量存在默认值,所以必须对其进行显式的赋值,否则编译无法通过。我想java正是通过这样的强制方式以防止你取到final成员变量的默认值(类似int-0、reference-null这样的默认值肯定不是你想要的,不是你声明“终态”final变量的初衷)。
对final成员变量的显式赋值操作可以是:
可以在声明变量时赋值;
      类变量:还可以在静态初始化块(Static Initializers、Static Initialization Blocks)中赋值
      实例变量:
            1 还可以在实例初始化块(Instance Initializers、Instance Initialization Blocks)中赋值
            2 还可以在构造方法中赋值(每一个存在(显式或隐式)super()调用的构造方法里都要做,即位于本类构造方法调用链链尾的构造方法里都要做,参考:http://wuaner.iteye.com/blog/1669937
引用
JLS 3rd - 8.3.1.2 final Fields http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.3.1.2
It is a compile-time error if a blank final (§4.12.4) class variable is not definitely assigned (§16.8) by a static initializer (§8.7) of the class in which it is declared.(final类变量如果既未在声明时赋值,也未在静态初始化块中赋值,报编译错误)
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.(final实例变量如果未在声明时赋值,且在构造函数调用结束后未被显式赋值,报编译错误)





通常将final和static结合使用来实现java中的常量:
http://wuaner.iteye.com/admin/blogs/1669122


Sources:
JLS 3rd - 4.12.4 final Variables
http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#4.12.4
JLS 3rd - 8.3.1.2 final Fields
http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.3.1.2
JLS 3rd - 17.5 Final Field Semantics
http://docs.oracle.com/javase/specs/jls/se5.0/html/memory.html#17.5
JLS 3rd - 13.4.9 final Fields and Constants
http://docs.oracle.com/javase/specs/jls/se5.0/html/binaryComp.html#13.4.9
Java Tutorials - Writing Final Classes and Methods
http://docs.oracle.com/javase/tutorial/java/IandI/final.html
分享到:
评论

相关推荐

    javafinal和static总结.docx

    javafinal和static总结.docx

    java中final和static的区别

    自己总结的java中final和static的区别,请大家提出宝贵意见。

    final类的适应实例

    Java中final类的简单使用,并对Java关键字的使用做出了总结

    Java关键字final、static使用总结

    Java 菜鸟必备 详细总结了键字final、static的使用 和限制

    java学习总结-final关键字

    final在java中的运用,以及final的使用范围

    java中final和static的总结

    NULL 博文链接:https://zkf60553.iteye.com/blog/1307592

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    Java final 修饰符知识点总结(必看篇)

    下面小编就为大家带来一篇Java final 修饰符知识点总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java中final关键字的用法总结

    在Java中,final可以别用来修饰类、修饰方法、修饰变量和修饰参数等,这里就来简单作一个Java中final关键字的用法总结:

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    Final 17 接⼝和抽象类 18 接⼝ 18 抽象类 18 异常 18 认识 Exception 18 什么是 Throwable 18 常⻅的 Exception 19 与 Exception 有关的 Java 关键字 19 什么是 Error 20 内部类 20 集合 20 ArrayList 21 Vector 21...

    java 编程入门思考

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Java关键字总结

    总结了Java学习中的52个关键字(包括一些总结),如果觉得自己Java基础知识需要总结一下的,可以下载下来瞧瞧 1.final数据: 1>对于基本类型前加以final修饰,表示被修饰的变量为常数,不可以修改。一个既是static有...

    Java面向对象总结

    在JAVA中使用关键字extends 3.调用子类的构造方法时,会先调用父类的构造方法。默认隐式调用父类无参数的构造方法 4.如果要在子类的构造方法中显式调用父类的构造方法。使用super(参数列表),但是这行代码必须是在 ...

    Java中final变量使用总结

    主要介绍了Java中final变量使用总结,final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常final定义的变量为常量,需要的朋友可以参考下

    java面试总结

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    static、final、abstract和interface使用总结

    自己总结了一下java中static、final、abstract和interface的用法

    java 面试题 总结

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    Java中final关键字的使用与注意总结

    主要给大家介绍了关于Java中final关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

Global site tag (gtag.js) - Google Analytics