深入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修饰的方法不可重写,修饰的类不可继承。

相关文章
|
19天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
18天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
1天前
|
Java 开发者
Java基础知识整理,注释、关键字、运算符
在日常的工作中,总会遇到很多大段的代码,逻辑复杂,看得人云山雾绕,这时候若能言简意赅的加上注释,会让阅读者豁然开朗,这就是注释的魅力!
34 11
|
5天前
|
安全 Java 机器人
《Java 简易速速上手小册》第2章:面向对象的 Java(2024 最新版)
《Java 简易速速上手小册》第2章:面向对象的 Java(2024 最新版)
19 0
|
5天前
|
安全 Java 开发者
Java并发编程:深入理解Synchronized关键字
【4月更文挑战第19天】 在Java多线程编程中,为了确保数据的一致性和线程安全,我们经常需要使用到同步机制。其中,`synchronized`关键字是最为常见的一种方式,它能够保证在同一时刻只有一个线程可以访问某个对象的特定代码段。本文将深入探讨`synchronized`关键字的原理、用法以及性能影响,并通过具体示例来展示如何在Java程序中有效地应用这一技术。
|
8天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
9天前
|
Java
Java关键字(1)
Java关键字(1)
|
12天前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
46 0
对象的交响曲:深入理解Java面向对象的绝妙之处
|
30天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
41 0
|
1月前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
10 1