一 final变量简介
1 final修饰变量时表示该变量一旦获得初始值之后就不可能改变。
2 final既可修饰成员变量,也可修饰局部变量。
二 final修饰成员变量
1 final修饰成员变量时,必须由程序员显示地指定初始值。
2 类变量:必须在静态初始化块中指定初始值或声明该变量时指定初始值,而且只能在两个地方的其中之一指定。
3 实例变量:必须在非静态初始化块中,声明该实例变量或构造器中指定初始化值,而且只能在三个地方其中之一指定。
4 代码示例一正确用法
public class FinalVariableTest { // 定义成员变量时指定默认值,合法。 final int a = 6; // 下面变量将在构造器或初始化块中分配初始值 final String str; final int c; final static double d; // 既没有指定默认值,又没有在初始化块、构造器中指定初始值, // 下面定义的ch实例变量是不合法的。 // final char ch; // 初始化块,可对没有指定默认值的实例变量指定初始值 { //在初始化块中为实例变量指定初始值,合法 str = "Hello"; // 定义a实例变量时已经指定了默认值, // 不能为a重新赋值,因此下面赋值语句非法 // a = 9; } // 静态初始化块,可对没有指定默认值的类变量指定初始值 static { // 在静态初始化块中为类变量指定初始值,合法 d = 5.6; } // 构造器,可对既没有指定默认值、有没有在初始化块中 // 指定初始值的实例变量指定初始值 public FinalVariableTest() { // 如果在初始化块中已经对str指定了初始化值, // 构造器中不能对final变量重新赋值,下面赋值语句非法 // str = "java"; c = 5; } public void changeFinal() { // 普通方法不能为final修饰的成员变量赋值 // d = 1.2; // 不能在普通方法中为final成员变量指定初始值 // ch = 'a'; } public static void main(String[] args) { FinalVariableTest ft = new FinalVariableTest(); System.out.println(ft.a); System.out.println(ft.c); System.out.println(ft.d); } }
5 运行结果
6
5
5.6
6 结果分析
请参考注释掌握final用法。
7 代码示例一错误用法
public class FinalErrorTest { // 定义一个final修饰的实例变量 // 系统不会对final成员变量进行默认初始化 final int age; { // age没有初始化,所以此处代码将引起错误。 System.out.println(age); age = 6; System.out.println(age); } public static void main(String[] args) { new FinalErrorTest(); } }
8 代码分析
如果打算在构造器,初始化块中对final成员变量进行初始化,则不要在初始化之前就访问成员变量的值。
三 final局部变量
1 使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
2 给局部变量赋初始值时,只能一次,不能重复。
3 代码示例
public class FinalLocalVariableTest { public void test(final int a) { // 不能对final修饰的形参赋值,下面语句非法 // a = 5; } public static void main(String[] args) { // 定义final局部变量时指定默认值,则str变量无法重新赋值 final String str = "hello"; // 下面赋值语句非法 // str = "Java"; // 定义final局部变量时没有指定默认值,则d变量可被赋值一次 final double d; // 第一次赋初始值,成功 d = 5.6; // 对final变量重复赋值,下面语句非法 // d = 3.4; } }
4 代码分析
上面程序还示范了final修饰形参的情形。因为形参在调用该方法时,由系统根据传入参数来完成初始化,困此使用final修饰的形参不能被赋值。
相关推荐
本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行
总结来说,"局部变量用final的讨论"涵盖了Java编程中`final`关键字的使用,包括其在变量不变性、代码优化、多线程安全、代码可读性和函数式编程中的作用。通过学习这个主题,开发者可以提升代码质量和效率,理解Java...
5. 是否共享:成员变量和类变量可能被多个对象共享,而局部变量仅在声明它的作用域内独立存在。 了解这些基本概念有助于写出更加合理、高效的Java代码。在实际编程中,根据需求选择适当的变量类型,可以帮助优化...
### Java中局部内部类可以访问它所在方法...- 非final局部变量不能被局部内部类访问,因为它们可能在方法执行过程中发生变化。 - 这种设计保证了局部内部类的灵活性和安全性,同时也展示了Java语言对内部类的强大支持。
// 错误,final变量不能再次赋值 final Student stu1 = new Student("张"); // stu1 = new Student("程"); // 错误,final引用变量的地址值不能改变,但对象内容可以改变 // stu1.setName("程"); // 正确,对象...
这种情况下的阅读和运行结果不一致,为了避免这种混淆,Java规定局部变量必须是final的,确保一旦赋值就不能更改,从而保证内部类的成员变量(实际上是局部变量的副本)与原始变量保持一致。 4. **final关键字的...
它可以修饰成员变量、局部变量和类(静态)变量。对于成员变量,`final`变量在构造函数中或初始化块中赋值,静态`final`变量则通常在类加载时初始化。如果未显式赋值,系统会赋予默认值,例如`int`类型的默认值是0。...
同样,在Java 8及更高版本中,`final`局部变量可以作为lambda表达式的捕获变量,保证了lambda表达式只能读取而不能修改这些变量。 在工具方面,IDEs如Eclipse和IntelliJ IDEA提供了很好的支持来使用`final`关键字。...
final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...
012-JavaSE进阶-final修饰局部变量
在这个特定的情况下,用户可能希望在保存代码时,Eclipse能自动将符合条件的局部变量声明为`final`。`final`关键字在Java中用于声明不可变的变量,这有助于提高代码的可读性、可维护性和安全性。 在Eclipse中实现这...
day11_04_final关键字用于修饰局部变量
final 修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。final 变量定义的时候,可以先声明,而不给初值,这中变量也称为 final 空白,无论什么情况,编译器都确保空白 final 在使用之前...
// final局部变量 System.out.println(local); } public static void main(String[] args) { final int argFinal = Integer.parseInt(args[0]); // final方法参数 } } ``` 在上面的例子中,`constant`、`...
被 static 修饰的成员变量和成员方法独立于该类的任何对象,可以在它的任何对象创建之前访问,无需引用任何对象。 1、static 变量(静态变量) static 变量是独立于该类的任何对象的,可以在它的任何对象创建之前...
方法中的变量有不同作用域:成员变量在整个类内有效,局部变量只在其定义的方法或块内有效,方法参数在其所属的方法或构造器内有效,而异常处理参数则局限于特定的异常处理代码。 构造方法是与类同名的方法,用于...
在创建匿名内部类时,如果需要访问外部类的非final局部变量,该变量必须声明为final。这是因为匿名内部类可以看作是外部类的子类,而局部变量的作用域仅限于方法,所以必须通过final保证变量的值在内部类创建后不会...
静态方法中不能访问非静态成员变量和非静态成员方法,因为这些成员是在创建对象之后才存在的,而静态方法并不依赖于任何特定的对象实例。 示例代码: ```java public class Test4 { public static void main...