#final分别可以修饰类、方法、变量、方法参数。
- 被final修饰的类不能被继承
- 被final修饰的方法不能被重写
- 被final修饰的变量不能被修改
- 被final修饰的方法参数在方法内不能被修改
类和方法被final修饰没啥好说的;被final修饰的基本类型的值不能被修改,被final修饰的引用类型的引用不能被修改,但是引用本身指向的内容是可以修改的;被final修饰的方法参数,在方法内,基本类型的值不能被修改,引用类型的引用不能被修改,引用本身指向的内容可以被修改。
final修饰变量
尝试修改final修饰的基本类型与引用类型。
class User{
String name;
Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
public class SuperClass {
public static void main(String[] args) {
final int a = 11;
// 被final修饰的基本类型的值不能被修改
// 报错,Cannot assign a value to final variable 'a'
// a = 22;
final User user01 = new User("aa", 11);
System.out.println(user01);
System.out.println(user01.name + user01.age);
System.out.println("-------------");
// 被final修饰的引用类型不能被重新赋值
// 报错,Cannot assign a value to final variable 'user01'
// user01 = new User("bb", 22);
user01.name = "bb";
user01.age = 22;
System.out.println(user01);
System.out.println(user01.name + user01.age);
}
}
运行结果:
com.zxl.test.User@74a14482
aa11
-------------
com.zxl.test.User@74a14482
bb22
通过代码可以看到
- 修改被final修饰的基本类型,报错
- 对final修饰的引用类型重新赋值时,会报错,但是可以修改此引用类型的内容。
- 意味着final限制的是引用类型的地址
final修饰方法参数
public class User {
public String name;
}
public class FinalClass{
public void finalPara(final int val, final User user){
// val = 20; // 报错
// user = new User(); // 报错
user.name = "33"; // 可以修改
}
}
public void testFinal(){
SubFinalClass subFinalClass = new SubFinalClass();
int a = 10;
User user = new User();
user.name = "11";
subFinalClass.finalPara(a, user);
System.out.println("a:" + a);
System.out.println("user:" + user + "; user.name:" + user.name);
System.out.println("------------");
a = 44;
user = new User();
user.name = "new";
System.out.println("a:" + a);
System.out.println("user:" + user + "; user.name:" + user.name);
}
testFinal()运行结果:
a:10
user:com.zxl.test01.User@1ad282e0; user.name:33
------------
a:44
user:com.zxl.test01.User@7f416310; user.name:new
从以上代码可以看到:
- 方法内,final修饰的参数不能修改,不能改变基本类型的值,也不能改变引用类型的引用,但是同样可以改变引用类型所指向的内容
- 方法外,参数可以被正常修改