- 浏览: 1151079 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- Java Foundation (41)
- AI/机器学习/数据挖掘/模式识别/自然语言处理/信息检索 (2)
- 云计算/NoSQL/数据分析 (11)
- Linux (13)
- Open Source (12)
- J2EE (52)
- Data Structures (4)
- other (10)
- Dev Error (41)
- Ajax/JS/JSP/HTML5 (47)
- Oracle (68)
- FLEX (19)
- Tools (19)
- 设计模式 (4)
- Database (12)
- SQL Server (9)
- 例子程序 (4)
- mysql (2)
- Web Services (4)
- 面试 (8)
- 嵌入式/移动开发 (18)
- 软件工程/UML (15)
- C/C++ (7)
- 架构Architecture/分布式Distributed (1)
最新评论
-
a535114641:
LZ你好, 用了这个方法后子页面里的JS方法就全不能用了呀
页面局部刷新的两种方式:form+iframe 和 ajax -
di1984HIT:
学习了,真不错,做个记号啊
Machine Learning -
赵师傅临死前:
我一台老机器,myeclipse9 + FB3.5 可以正常使 ...
myeclipse 10 安装 flash builder 4.6 -
Wu_Jiang:
触发时间在将来的某个时间 但是第一次触发的时间超出了失效时间, ...
Based on configured schedule, the given trigger will never fire. -
cylove007:
找了好久,顶你
Editable Select 可编辑select
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成员变量也不例外。如下例:
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)
通常将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
用在类上:表示该类不能被继承。
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
0
null
2
abc
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实例变量如果未在声明时赋值,且在构造函数调用结束后未被显式赋值,报编译错误)
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
发表评论
-
J2SE Evolution
2013-04-11 15:39 1188Java 7 New Features Java SE 7 ... -
未完 Java: IO & NIO(new I/O)
2013-01-11 20:56 2063适用: event and data-driven apps ... -
未完 java设计: naming convention | 命名规范
2012-11-20 16:45 2134应该遵循的规范: 类/接口/属性名,使用名词或形容词 ... -
未完 Java: enum 枚举
2012-11-19 20:29 1826http://stackoverflow.com/que ... -
Java多线程之 concurrent 并发包
2012-11-01 07:47 2028Java Tutorials -> Concur ... -
未完 Java Tips & Tricks & Notes
2012-09-12 10:00 1134Hidden Features of Java: h ... -
未完 Java Socket
2012-09-12 08:42 1025Java SocketJava SocketJava Sock ... -
Java For-each Loop & Iterable | 增强型For循环和Iterable接口
2012-09-11 21:50 2066增强型For循环没什么好说的,Just see link ... -
未完 Java Collections | 容器
2012-09-06 11:35 1842Sources: http://docs.oracle.com ... -
Java object Initialization (class Instantiation) | 对象的初始化(即类的实例化)
2012-09-03 09:12 3012类实例即对象 ... -
未完Java class&interfac 's Loading, Linking and Initializing | 类与接口的加载、链接和初始化
2012-08-31 19:01 1681JVM装载一个类的时候,首先检查他有没有父类,如果有父类则装载 ... -
未完 java Static 总结
2012-08-31 18:47 1407static可以用来修饰: 字段 Fields 方法 Meth ... -
未完 JVM Runtime Data Areas & Java Memory Model | 内存分配模型 & Java数据存储
2012-08-31 18:43 1892Java虚拟机内存分配模型 需精读:Chapter 5 of ... -
Java Data Types & Literals | 数据类型 和 字面量
2012-08-30 18:12 3954Java数据类型划分: OR http:// ... -
未完 Variables 变量 (Instance/Class/Local)
2012-08-29 10:59 1713Local/Instance/Class Variables ... -
未完 Regular Expressions | 正则表达式
2011-08-25 11:43 1532Extended Regular Expression ... -
java Date(util.Date/sql.Date/sql.Timestamp/sql.Time) & Oracle DATE Type 时分秒 精度问题
2011-05-17 09:32 3972遇到的问题描述: 数据库为Oracle,其jdbc驱动为ojd ... -
Java byte code (bytecode)
2011-05-04 02:55 3891keys: bytecode, byte code, opco ... -
Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强
2011-04-21 13:29 2431Setting the class path: http:// ... -
class literal & instance.getClass() & Class.forName(String className)
2011-04-20 12:33 2343常用的几种取得Class类实例的方式: 1 class lit ...
相关推荐
总结来说,final关键字在Java编程中扮演了多种角色,从确保常量的不变性,到防止方法重写,再到优化性能,它都发挥着至关重要的作用。合理利用final可以提高代码质量,减少逻辑错误,增强代码的可预测性和可维护性。
在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...
"Java关键字final、static使用总结" 在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用...
Java 中的 final 和 static 关键字详解 Java 中的 final 和 static 关键字是两个重要的关键字,它们在 Java 编程中扮演着重要的角色。本文将详细介绍 final 和 static 关键字的使用方法和注意事项。 一、final ...
总结一下,`final`关键字用于防止继承、方法重写和变量值的改变,以确保代码的稳定性和设计意图。`static`关键字则用于定义类级别的成员,使其独立于对象实例存在,提高代码的复用性和效率。理解和熟练运用这两个...
Java中final类的简单使用,并对Java关键字的使用做出了总结
Java中的`final`关键字是一个非常重要的概念,它用于在编程中实现不可变性。下面是对`final`关键字的详细解释: ## Java最终变量 当一个变量被声明为`final`时,这意味着它的值一旦被赋值后就无法再改变。这在Java...
- 关键字:Java中的关键字,如`class`, `extends`, `implements`, `public`, `private`, `protected`, `import`, `final`等,用于构建Java程序。 - 数据类型:Java的基本数据类型包括`byte`(字节)、`short`(短...
### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...
final在java中的运用,以及final的使用范围
在Java编程语言中,`final`与`static`是两个非常关键且常用的关键字,它们各自具有独特的功能和用途,可以极大地增强代码的稳定性和可维护性。下面将详细解析这两个关键字的用法及其在Java中的重要性。 ### 一、`...
Java中的关键字this、final以及super在编程中扮演着至关重要的角色。下面我们将深入探讨这些关键字的用法和意义。 首先,`this`关键字是Java中一个非常基础且实用的元素,它代表当前对象的引用。当类的成员变量与...
以下是对Java学习的详细总结: 一、简介 Java由James Gosling于1995年在Sun Microsystems公司开发,最初设计用于电视顶盒,但后来因其“一次编写,到处运行”(Write Once, Run Anywhere)的理念,迅速被广泛应用在...
### Java OOP 总结资料知识点详解 #### 面向对象编程(OOP)的核心概念与原则 **一、抽象与封装** 1. **面向对象设计的过程:** - **发现类:** 定义出系统中参与交互的基本实体。 - **发现类的属性:** 确定每个类...
总结来说,`final`关键字在Java中扮演着多种角色:确保变量的不可变性、阻止类的继承以及防止方法的重写。理解并熟练运用`final`,可以帮助开发者编写更安全、更易于维护的代码。在实际编程中,合理利用`final`可以...