1. final变量
2. final方法
3. final类

1. final 变量

final关键字时常用于修饰变量,比如 final int age = 21,起到一种类似于是C语言中的宏定义的作用,这里变量一旦声明,就不能再进行更改。final修饰的变量必须要在定义的时候就赋予初始值,或者可以先定义然后再构造方法中赋初值。而若是static 和 final一同修饰的变量,那么需要在定义的时候赋值,且通常为大写字母用下划线连接。
也可以在有参的方法中将参数类型用final修饰,被final修饰的参数也是不可以改变的,只能进行值的调用。

另外,final除了修饰几种基本类型数据,还可以修饰对象引用。

举个例子

public class FinalTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Quote quote = new Quote();
		quote.i ++;
		System.out.println(quote.i);
	}

}

class Quote{
	public int i = 0;
}

上面的final Quote quote = new Quote();就是一个对象引用。

运行结果

final java 变量命名规范 java修改final变量_System


可以看出来final修饰的对象引用所指向的空间的值由0变成了1,也就是这里的值是可以发生改变的。

那么final修饰的“不可变”在对象引用时提先在哪里?看下面的例子

public class FinalTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		final String s1 = "我是";
		 String s2 = "我是";
		String s3 = "A";
		String Fs = s1 + "A"; 
		String Us = s2 + "A";
		String s = "我是A";
		
		System.out.println((Fs == s));
		System.out.println((Us == s));
		
	}

}

运行结果

final java 变量命名规范 java修改final变量_final java 变量命名规范_02


首先java 中String 是个对象,是引用类型,因此这里用string类型来进行引用对象的验证,==符号当比较对象时,比较规则是:两个对象基于内存引用,若两个对象的引用完全相同,也就是指向的空间和内容都相同,则==返回的结果为true。

根据上面的运行结果,final修饰的引用类型所指向的空间没有发生变化,因此,当final修饰对象的时候,指向的空间没有发生变化。这也是此时final的“不可变“的体现。

2. final方法

用final修饰的父类方法,是不可以被子类覆盖(重写)的,另外,了解继承的应该都知道,在父类中用private修饰的方法是不能在子类中重写的,因此也可以理解为private修饰的方法被隐式的指定为用final修饰。因此一个被定义为private的方法也就不需要再用final再进行修饰

class Parent{
	private final void Method1() {
		System.out.println("父类一");
	}
	public final void Method2() {
		System.out.println("父类二");
	}
	public void Method3() {
		System.out.println("父类三");
	}
	
}

class ChildClass extends Parent{
	
}

尝试对上面方法重写

final java 变量命名规范 java修改final变量_对象引用_03


可以看到只有没有被final和private修饰的Method3()方法可以重写,其余都不可以。

3. final类

被final修饰的类不能被继承。并且不能做任何的修改。
.
.
.
欢迎交流和指正