在java中,final关键字和static关键字一样,都可以用来修饰方法成员变量,通常可以用来改善应用程序的性能,但是final强调的是“不可变性”。

1.修饰变量

final关键字可以用来修饰成员变量和方法中的变量。当一个数据被final和static同时修饰时,我们通常把它称为常量。

final的不可变性表现在:被final修饰的变量只能够进行一次赋值操作。

java 被final修饰的局部变量 java中被final关键字修饰的变量_java 被final修饰的局部变量

如图所示,当变量第一次被赋值后,就不可以在对其进行更改。

成员变量和方法中的变量有点区别,成员变量必须要进行初始化,而方法中的变量则不必。

java 被final修饰的局部变量 java中被final关键字修饰的变量_关键字_02

对于在修饰成员变量时,只有3种情况可以对它进行赋值。

1.在声明时就进行赋值

java 被final修饰的局部变量 java中被final关键字修饰的变量_java 被final修饰的局部变量_03

2.在构造方法中进行赋值

java 被final修饰的局部变量 java中被final关键字修饰的变量_关键字_04


3.将其加上static修饰符后,可以在static代码块中进行赋值

java 被final修饰的局部变量 java中被final关键字修饰的变量_java_05

注意:对于基本数据类型来说,被final修饰后,指的是它的值不会发生改变,对于引用类型来说,被final修饰后指的是它的引用对象不会发生改变(即只能指向最初赋值的那个对象,不能够再更改),但是它引用的这个对象本身是可以改变的,因为引用的其实是一个地址,而这个地址虽然不会变,但地址中的内容可能会变。

class People{
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}
public class Test{
	public static void main(String[] args) {
		final People people = new People();
		people.setName("张三");
		people.setAge(18);
		System.out.println(people.getName());
		System.out.println(people.getAge());
	}
}

最后,由于final在一次赋值后就不会改变,所以如果在编译时就明确知道其值的话,编译器就会把它当做常量来处理,进行相应的优化,可以提高程序效率。

2.修饰方法

在方法前面可以使用final来修饰,一旦声明为final方法,则此方法不能够被子类所重写,但是可以重载。

java 被final修饰的局部变量 java中被final关键字修饰的变量_赋值_06



java 被final修饰的局部变量 java中被final关键字修饰的变量_java_07


注意:如果在父类中的final方法是用private修饰的,那么子类中是可以有同名的方法的,但是这里并不是重写,因为private不能被子类继承,所以其实是相当于在子类中有一个新的方法,恰好名字相同而已,这个方法是属于子类的,而不是从父类继承而来的。(注:private方法会被隐式的声明为final)

当我们不想要子类对方法进行重写时,通常会把方法声明为final,此外final方法通常在性能上会比普通方法好一点。

3.修饰类

被final修饰的类是不可以被继承的,常见的比如String类,他就是final类,是不可继承的。使用final类的好处是他们的对象是只读的,可以在多线程下安全的共享,不用额外的同步开销等。

注意:final类的所有方法都被隐式的声明为final方法。

总结

2.修饰方法:不能被重写,可以被重载。

3.修饰类:不能被继承。