科技资讯

[Java基础]用final关键字修饰方法的参数

发布日期:2023-07-06    点击次数:199

在项目学习过程中,接触到了一种传参的方式:用final关键字修饰方法的参数。

一、在方法中,用final修饰参数的好处如下:

1、确保,不会也不能对于参数进行修改,保证了调用发起方数据的安全;

2、避免在方法体中修改参数,引起不必要的错误;

3、程序员工作不是一个人的工作,你设置为final,别人将来维护的时候一看就知道这个变量不能修改,而不需要去记忆这个是不能变化的值,是常量。这个是代码规范

二、关于final关键字

1、修饰引用类型变量

1.1.Map,Entity,List等

以map类型为例

importjava.util.*;publicclassHelloWorld{publicstaticvoidmain(String[]args){Mapmap=newHashMap;process(map);System.out.println(map.keySet.iterator.next);//结果输出aaa}privatestaticvoidprocess(finalMapmap){map.put("aaaa","1111");//尽管map为final,但是只是地址不变//map里面的内容可以改变//map=newHashMap;//当从新为final变量map分配内存地址,//引起编译错误,因为final修饰的map内存地址不可以改变。}}

这样执行,能正常打印:aaa

因为Map,Entity,List等引用类型,声明时在堆中new一个区域,在栈中保存了对象的引用。我们为变量map添加新的元素时,是修改了map在堆中的内容,并没有修改map变量在栈中保存的指向堆的地址,所以能正常编译。

但是如果在process方法中写

map=newHashMap;map.put("aaaa","1111");

会报错:

因为map=newHashMap,为map变量在堆中又重新分配了一个区域,这时候将map指向这个新分配的区域,就改变了map变量在栈中保存的指向堆的地址,所以,此时会报错:不能分配最终参数map;

1.2.String类型

importjava.util.*;publicclassHello{publicstaticvoidmain(String[]args){Stringa="wkx";process(a);System.out.println(a);//结果输出aaa}privatestaticvoidprocess(finalStringa){a="王可欣";}}

编译时会报错:

因为String类型的变量,每次重新赋值时,在堆中会重新new一个区域,这样就改变了在栈中保存的变量的地址,所以,用final修饰的String类型的变量不能再重新赋值。

2、修饰基本类型变量

importjava.util.*;publicclassHelloInt{publicstaticvoidmain(String[]args){inta=2;process(a);System.out.println(a);}privatestaticvoidprocess(finalinta){a=3;}}

基本类型的变量声明在栈中,用final关键字修饰后,不能被改变。

整体来说,只要变量被final关键字修饰后,在栈中保存的变量的内容便不能被改变。



上一篇:方舟健客创始人谢方敏:致力于打造一家以技术为核心的互联网创新医疗企业
下一篇:德媒: 电子商务在疫情繁荣后受到打击