一、final修饰成员变量
与普通成员变量不同的是,final成员变量(包括实例Field,类Field) 必须由程序员显示的初始化,系统不会默认的为它初始化;
例如:
public class Test{
final int age;
{
System.out.print(age) //就会报错
age=6;
System.out.print(age); //这个是正确
}
public static void mian(String[] args){
new Test();
}
}
二、final局部变量
如果final修饰的局部变量,如果局部变量没有赋值的的,可以赋值一次,接下来就不可以赋值了,如果final修饰的局部变量,已指定默认值,则不能进行再一次进行赋值;
例如:
public class Test{
public void init(final int a){
a=2;//错误
}
public static void main(String[] args){
final String str="hello";
str= "JAVA"; //错误
final Double d;
d=3.4;//正确
}
}
三、final修饰基本类型变量和引用类型变量区别
public class Test{
public static void mian(String[] agrs){
final int[] arr={5,6,7,8};
arr[2]=-8;//正确
arr=null;//错误
final Person p=new Person();
p=null //错误
}
}
final 修饰的基本类型变量,引用类型变量,可以修改引用变量所引用的对象的内容,但是不能对引用的对象重新赋值操作;
四、可替换成“宏替换”的final的变量
java使用常量池管理以前用过的字符串直接量,例如执行String a="java" ;语句之后系统的字符串会缓存一个字符串"java" 如果程序在执行String b="java" 系统会让b直接指向字符串池中的"java"字符串,因此a==b 为true
例如:
String s1="疯狂java";
String s2="疯狂"+"java";
System.out.print(s1==s2); //true 从String常量池中缓存中去找到了
String c=new String("hello");
String d=new String("hello");
System.out.print(c==d); //false 创建对象不同
System.out.print(a.equals(b)) //true 比较的是字符串的内容
String a="hello";
String b="hello";
System.out.print(a==b); //true
String str="疯狂Java";
String str1="疯狂";
String str2="Java";
String str3=str1+str2;
System.out.print(str==str3); //false,因为str2和str3均为变量所以没有在编译的时候就确定下来值,所以为false;如果str2和str3采用final修饰则就会变为true,在编译的时候就确定下来了。
五、final修饰的方法:
final修饰的方法既不可以被重写,但可以被重载;
六、final修饰的类:
final修饰的类不能有子类,如果父类是final则子类就不能去继承它否则会报错;
七、不可变的类:
例如String就是一个final修饰的类,没有为String提供一个可以修改的方法;