深入java面向对象二:final关键字

文章内容源于对《疯狂java讲义》及《疯狂Java:突破程序员基本功的16课》学习和总结。

一、 final成员变量
final 修饰变量时,表示该变量一旦获取了值就不可以改变了。
但是我们知道,当一个类被加载,或者是实例化对象时,系统会为类成员赋初始值,所以,final关键字修饰的成员变量,必须有程序员指定初始值,一旦指定了初始值,就不可以再改变。
其初始化可以在两个地方:
类Field:必须在声明该变量时或静态初始化快中指定初始值。
实例Field: 必须在非静态初始化块、声明该Field或构造器中指定初始值。

示例:

public class FinalVariableTest
{
	//定义成员变量时指定默认值,合法。
	final int a = 6;
	//下面变量将在构造器或初始化块中分配初始值
	final String str;
	final int c;
	final static double d;
	//既没有指定默认值,又没有在初始化块、构造器中指定初始值,
	//下面定义char Field是不合法的。
	//final char ch;
	//初始化块,可对没有指定默认值的实例Field指定初始值
	{
		//在初始化块中为实例Field指定初始值,合法
		str = "Hello";
		//定义a Field时已经指定了默认值,
		//不能为a重新赋值下面赋值语句非法
		//a = 9;
	}
	//静态初始化块,可对没有指定默认值的类Field指定初始值
	static
	{
		//在静态初始化块中为类Field指定初始值,合法
		d = 5.6;
	}
	//构造器,可对既没有指定默认值、有没有在初始化块中
	//指定初始值的实例Field指定初始值
	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);
	}
}

编译运行结果:

6
5
5.6

二、 final局部变量

对于使用final修饰局部变量,即可以在定义时指定默认值,也可以不指定默认值;
如果一旦赋了初始值,则之后都不可以再修改变量值。

public class FinalLocalTest
{
	public static void main(String[] args)
	{
		//定义一个普通局部变量
		final int a = 5;
		System.out.println(a);
	}
}

三、 内部类中的局部变量

另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用:

public class INClass {
   void innerClass(final String str) {
         class IClass {
                  IClass() {
                     System.out.println(str);
                  }
         }
         IClass ic = new IClass();
   }

  public static void main(String[] args) {
       INClass inc = new INClass();
       inc.innerClass("Hello");
  }
}

四、 final宏替换

final有一个很重要的概念,就是宏替换;宏替换的应当满足的条件:

· 使用final修饰符修饰变量

· 在定义该final变量时只定了初始值

· 该初始值可以在编译时就被确定下来。

public class FinalLocalTest {
   public static void main(String[] args) {
      // 定义一个普通局部变量
      final int a = 5;
      System.out.println(a);
   }
}

 
总结:

1.  final修饰基本类型和引用类型有所不同,final修饰基本类型变量时,只要基本类型被赋初始值,则不可改变; 但final修饰引用类型时,引用的地址不可改变,但是引用的值是可以改变的。
2.  final执行宏替换时,在程序运行过程中,有替换的值直接参与程序的执行,而并非变量。
3. final修饰的方法不可重写,修饰的类不可继承。

时间: 2025-01-21 18:04:35

深入java面向对象二:final关键字的相关文章

Java面向对象高级--final关键字

class A{ private final String INFO = "INFO" ; // 声明常量 public final void print(){ // 使用final声明的方法不能被覆写 INFO = "HELLO" ; } }; 常量必须在声明时为其明确指定内容. final声明的变量全部用大写字母形式,这也是命名规范. 即:常量全部必须大写. 全局常量: 使用static final关键字联合声明的变量称为全局常量: public static

浅析Java中的final关键字

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

浅析Java中的final关键字(转)

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

深入浅析Java中的final关键字_java

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. final 对于常量来说,意味着值不能改变,例如 final int i=100.这个i的值永远都是100.但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final

转载:浅析Java中的final关键字

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

详解Java中的final关键字的使用_java

final含义 final是Java中的一个保留关键字,可以声明成员变量.方法和类.一旦你将引用声明为final类型,你将不能再改变这个引用了.编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误.final变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫做final变量.下面是final修饰变量的例子: final int constValue = 1; // constValue = 2; The final local va

JAVA中的final关键字用法实例详解_java

本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

浅谈Java中的final关键字与C#中的const, readonly关键字_java

在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

深入解析Java编程中final关键字的作用_java

final class当一个类被定义成final class,表示该类的不能被其他类继承,即不能用在extends之后.否则在编译期间就会得到错误. package com.iderzheng.finalkeyword; public final class FinalClass { } // Error: cannot inherit from final class PackageClass extends FinalClass { } Java支持把class定义成final,似乎违背了面