java回顾之final

final关键词
用于表示它修饰的类,方法,变量不可改变
修饰变量时,一旦其获得了初始值,就不可改变,它既可以修饰成员变量,也可以修饰局部标量,形参等
final修饰的成员变量必须现实的指定初始值,系统不会饮食的对其进行隐式初始化

例如 

public class FinalVariableTest 
{
   public void test(final int a)
   {
	   //a=5;//错误,应该由系统传入的参数进行初始化,所以这里不能被赋值
   }
	public static void main(String[] args)
	{
		final String str="zx";//定义局部变量默认值,则不能再被赋值
		//str="12";//错误,不能再被赋值
		
		final int a;//没有指定默认值,可以被赋值一次
		a=5;
		
		//a=4;//再次被赋值,错误
		
	}
}

  

final修饰的基本类型变量和引用类型变量区别
对于引用类型变量来说,他保存的仅仅是一个引用,final只保证所引用的地址没变,即引用的是同一个对象
但是对象时可以随意改变的
例如

class PersonClass {
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	public PersonClass(){}
	public PersonClass(int age)
	{
		this.age=age;
	}
}
 
 class Go
 {
	 public static void main(String[] args)
	 {
		 final PersonClass pClass=new PersonClass(45);
		// pClass=null;//引用的不再是原来的对象了,所以出错
		 
	 }
 }

  

final方法表示不希望子类重写父类的某个方法
比如

class BaseClass
 {
	 public final void get()
	 {
		 
	 }
	 private final void set()
	 {
		 
	 }
 }
 class SonClass extends BaseClass
 {
	 //public void get();//会出错,不能重写final方法
	 public void set()
	 {
		 
	 }//因为private子类无法访问,就相当于创建了一个新方法
	
 }

  具体还有不可变类,出现的场合,比如你项目初始化一些不可变的参数,例如你使用一个map保存了项目中所有的配置文件的键值对,这些键值对是永不变的,为了防止客户的改变,你可能就需要使用不可变类,每个返回给用户一个保护性的拷贝。

只要不是固定的,永不改变的东西,对于类的设计都不需要不可变类,不可变的类的实现也是需要消耗一定的内存和性能的,可以通过缓存不可变类来实现减少开销,具体实现方法,待写

原文地址:https://www.cnblogs.com/vincentmax/p/5935132.html