参考: http://liyuan2005.iteye.com/blog/209206
1.
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变
。
2.
其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中
。这两个 地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。
3.
引用对象 can never be changed to point to another object.
However, 引用对象 can be modified;
public class Bat {
final double PI = 3.14; // 在定义时便给址值
final int i; //称为"Blank final",因为要在构造函数中进行初始化,所以此处便不可再给值
final List list; // 此变量也与上面的一样
Bat() {
//PI=3.14; 不能同时既在定义时给了值,又在构造函数中给另外的值
i = 100;
list = new LinkedList();
}
Bat(int ii, List l) {
i = ii;
list = l;
}
public static void main(String[] args) {
// 1. 默认的构造函数
Bat b = new Bat();
System.out.println(b.i + "->" + b.list.getClass());
// 不论是i的 值或是list的类型,一旦初始化,无法再更改
// b.i=25;
// b.list=new ArrayList();
// 2.带参数的构造函数
Bat b2 = new Bat(10, new ArrayList());
System.out.println(b2.i + "->" + b2.list.getClass());
// 可以通过重新初始化来指定i的值或list的类型
//引用对象 can never be changed to point to another object.
//However, the object can be modified;
b2.list.add("aaa");
}
}
分享到:
相关推荐
这是因为匿名内部类可以看作是外部类的子类,而局部变量的作用域仅限于方法,所以必须通过final保证变量的值在内部类创建后不会改变。 5. **final和效率** 在某些情况下,JVM会进行逃逸分析,如果发现final变量...
在Java语言中,final域的访问顺序是:首先访问final域,然后访问非final域。 * final域为基本类型:final域为基本类型时,访问顺序是:首先访问final域,然后访问非final域。 * final域为引用类型:final域为引用...
这是因为内部类会捕获封闭作用域中的变量的副本,而`final`确保变量在内部类中不可变。 接下来,我们讨论`static`关键字。`static`主要用于表示与类相关联的成员,而不是类的实例。其主要特性包括: 1. **静态变量...
- 对于不变对象(immutable objects),所有域都是final和静态的,这样可以提高性能并防止意外修改。 总之,理解和熟练运用Java的静态域和实例域以及它们与构造方法的关系是Java程序员的基本技能。通过合理的设计和...
在这个例子中,`count`变量必须是`final`的,因为线程可能会在创建后才执行,此时外部类的作用域可能已经结束。 总的来说,`final`关键字在Java中起到了关键的约束和保护作用,保证了代码的稳定性和可预测性。理解...
因此,"AD域分页查询全部域用户数据"是一种优化查询效率的方法,它允许管理员分批获取用户信息,而不是一次性加载。 首先,我们需要理解AD域分页查询的工作原理。在Java中,我们可以使用JNDI(Java Naming and ...
有初始值的 final 域域,即声明为 final 且当场就给定初始值的域。例如 `private final int valueOne = 9;`。final 修饰的基本数据类型变量存储的数值永恒不变。例如 `private final int valueOne = 9;`,你不能再对...
对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域的写,与随后把这个构造对象的引用赋值给一个变量,这两个操作之间不能重排序 初次读一个包含 final 域的对象的引用,与...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被广泛用于声明不可变的对象、变量和方法,确保代码的稳定性和安全性。在这个"java提高篇之关键字final编程开发技术共5页.pdf"的资料中,我们将会深入...
2. final修饰的局部变量需要在定义时或在其作用域内初始化,且一旦初始化后不能改变。final修饰的形参在方法调用时根据传入的参数自动初始化,不能在方法内部再赋值。 ```java public class FinalLocalVariable { ...
- **局部变量**:局部变量被`final`修饰后,也必须在声明时或其作用域内显式初始化,之后不能再次赋值。 2. **final方法**: - 当一个方法被`final`修饰时,它不能被子类重写。这有助于确保代码的完整性和一致性...
在Java中,可以将实例域定义为final。在构建对象时必须初始化这样的值。必须确保在每个构造器执行之后,这个域的值被设置,并且在后面的操作中不再对其修改。使用final声明变量之后,这个值就不能修改,一般final...
### Java Persistence API 2.0 (JPA 2.0) Final Release文档解析 #### 标题:Java Persistence API 2.0 FINAL文档 #### 描述解析:Java Persistence API(JPA)2.0规范概述 Java Persistence API (JPA) 2.0是一个...
写 final 域的重排序规则 56 读 final 域的重排序规则 57 如果 final 域是引用类型 60 为什么 final 引用不能从构造函数内“逸出” 63 final 语义在处理器中的实现 65 JSR-133 为什么要增强 final 的语义 65 ...
Java 允许在类中定义未初始化的 `final` 域,但必须在每个构造器中对其进行赋值。这提供了一种灵活性,可以根据不同对象的需求在构造期间赋予 `final` 域不同的值。例如: ```java public class JavaBlankFinal { ...
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则: 1、在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个...
当在匿名内部类中引用外部局部变量时,该变量必须是`final`或实际上等效于`final`,因为内部类可能在外部作用域之后被实例化,因此需要一个不可变的引用。 总的来说,`final`关键字在Java中提供了一种强大的工具,...
当一个匿名内部类引用了一个外部作用域的变量时,若要确保内部类在使用该变量时总是引用其初始值,变量必须声明为`final`。对于lambda表达式,如果捕获了外部的非final或effectively final变量,编译器会抛出错误。 ...
Java 中局部内部类可以访问它所在方法中定义的 final 修饰的局部变量的合理解释 在 Java 中,局部内部类可以访问它所在方法中定义的 final 修饰的局部变量,这是一个非常重要的知识点。这是因为 JVM 在编译时会将 ...
* C++ 中,常量可以在任何地方被定义,使用关键字 const 来定义常量,而 Java 中是 final。 类 * C++ 中对类的定义与 Java 有些不同,其中的 public 和 private 部分是分开的,而 Java 中,每一个元素都必须标明 ...