Java基础(06)——final关键字的作用

#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修饰的参数不能修改,不能改变基本类型的值,也不能改变引用类型的引用,但是同样可以改变引用类型所指向的内容
  • 方法外,参数可以被正常修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值