Java final 关键字示例

时间:2020-02-23 14:36:35  来源:igfitidea点击:

Java中的final关键字可以与变量,方法和类一起使用。

  • final变量:将变量标记为final变量时,我们无法重新分配其值。

  • final类:如果类是final的,则无法被继承

  • final方法:我们无法覆盖final方法。

让我们更详细地研究final关键字。

1. final变量

Java提供了两种创建变量并为其赋值的方法。

  • 我们可以声明一个变量并稍后分配值。

  • 我们可以使用赋值运算符在同一条语句中声明变量并赋值。

让我们看看两种情况下最终变量的用法。

package com.theitroad.examples;

public class Config {

	final static String NAME = "CONFIG";

	final long initTime;

	Config() {
		this.initTime = System.currentTimeMillis();
	}

	public static void main(String[] args) {
		Config cfg1 = new Config();
		System.out.println(cfg1.initTime);

		Config cfg2 = new Config();
		System.out.println(cfg2.initTime);

		//The final field Config.NAME cannot be assigned
//		Config.NAME = "config";

		//The final field Config.initTime cannot be assigned
//		cfg1.initTime = 1L;
	}
}

1.1)Java final变量是常量吗?

由于我们无法将新值重新分配给最终变量,因此它们看起来像常量。
但是,这取决于最终变量的类型。

如果最终变量数据类型是不可变的,例如基元和字符串,那么最终变量将保持不变。

如果最终变量数据类型是可变的,则可以调用方法来更改对象状态。
在这种情况下,最终变量不是恒定的,因为可以更改。

让我们用一个简单的例子来理解这一点。

package com.theitroad.examples;

public class FinalExamples {

	//data types are immutable
	final static int COUNT = 10;
	final static String NAME = "FinalExamples";
	
	//data types are mutable
	final static StringBuilder SB = new StringBuilder();
	
	public static void main(String[] args) {
		SB.append("Hello");
		System.out.println(SB.toString());
		
		SB.append("Java");
		System.out.println(SB.toString());

	}
	
}

1.2)局部 final 变量

在方法内部创建最终变量时,称为局部最终变量。

void foo(int[] ints) {
	final int x = 10;
	final boolean flag;
	flag = true;

	for (final int i : ints) {
		System.out.println(i);
	}
}

我们能够在增强的for循环中使用final关键字,因为当for循环迭代完成时,每次都会创建一个新变量。
对于普通的for循环而言,情况并非如此,因此以下代码将引发编译时错误。

//The final local variable j cannot be assigned. 
//It must be blank and not using a compound assignment
for(final int j = 0; j< ints.length; j++) {
	System.out.println(j);
}

2. final类

当一个类声明为final时,我们不能扩展它。
这叫做期末课。
JDK中最后一个类的完美示例是String类。

如果必须创建一个不可变的类,则必须将其标记为最终类。

final class SecureAccess{
	
}

//compile time error
//class MoreSecureAccess extends SecureAccess {}

3.final 方法

当一个方法被标记为final方法时,它称为final方法。
最终方法不能在子类中覆盖。
例如,对象类的wait()和notify()方法是最终的,我们不能在实现类中覆盖它们。

最终方法允许重载。
让我们看一下Java中最终方法的示例。

package com.theitroad.examples;

public class Base {
	
	final void foo(int i) {}
	
	//overloading is allowed
	void foo(int i, String s){}
}

class Child extends Base{
	
	@Override
	void foo(int i, String s) {}
	
	@Override
	//void foo(int i) {}
}

4.什么时候在Java中使用final关键字?

  • 我们可以使用final关键字定义一些类级别的常量。

  • 当您不希望更改对象时,为它们创建最终变量,例如可用于记录目的的特定于对象的属性。

  • 如果您不希望扩展该类,请将其标记为final。

  • 如果要创建不可变的类,则必须将其设为最终类。

  • 如果您希望所有子类的方法实现都保持不变,则将它们标记为最终方法。