【Java基础】用final关键字修饰方法的参数

简介: 【Java基础】用final关键字修饰方法的参数

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



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

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

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

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


二、关于final关键字

1、修饰引用类型变量


1.1.Map,Entity,List<Object>等

以map类型为例

import java.util.*;
public class HelloWorld {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>(); 
        process(map);
        System.out.println(map.keySet().iterator().next()); //结果输出aaa
    }
    private static void process(final Map<String,String> map) {
        map.put("aaaa", "1111"); //尽管map为final,但是只是地址不变
        // map里面的内容可以改变
        //map = new HashMap();//当从新为final变量map分配内存地址,
        // 引起编译错误,因为final修饰的map内存地址不可以改变。
    }
}



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

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


但是如果在process方法中写

map = new HashMap();
map.put("aaaa", "1111"); 


会报错:

20180812201602514.png


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

1.2. String类型

import java.util.*;
public class Hello{
    public static void main(String[] args) {
        String a="wkx";
        process(a);
        System.out.println(a); //结果输出aaa
    }
    private static void process(final String a) {
        a ="王可欣";
    }
}


编译时会报错:


20180812201656934.png


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


2、修饰基本类型变量

 

import java.util.*;
public class HelloInt{
    public static void main(String[] args) {
        int a = 2;
        process(a);
        System.out.println(a);
    }
    private static void process(final int a) {
        a = 3;
    }
}


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


20180812201816882.png


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


关于final关键字的其他介绍:


https://blog.csdn.net/qq1028951741/article/details/53418852


https://www.cnblogs.com/dotgua/p/6357951.html


相关文章
|
12天前
|
Java
Java——方法的引用
方法引用允许将已有方法作为函数式接口的实现。使用“::”符号,需具备函数式接口,被引用的方法须存在且参数和返回值需与抽象方法一致。其分类包括:静态方法引用(类::方法名)、成员方法引用(对象::方法名、this::方法名、super::方法名)和构造方法引用(类名::new)。方法引用提高了代码的简洁性和可读性,减少了样板代码。
29 13
Java——方法的引用
|
8天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
4天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
14 4
|
7天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
37 4
|
13天前
|
Java API
Java方法的优缺点
Java 方法是编程的基本构建块,具有代码重用性、模块化、易于调试、增强可读性、支持重载和可变参数、封装性及静态与实例方法的灵活性等优点,但也存在性能开销、过度抽象、限制使用环境、参数传递开销、命名冲突和堆栈溢出等缺点。合理设计方法可确保代码高效且易维护。
|
8天前
|
安全 Java
java调用方法
java调用方法
18 4
|
13天前
|
Java
Java的方法详解
在 Java 中,方法是执行特定任务的代码块,包括定义、参数传递、返回值处理及重载等功能。
|
22天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
9天前
|
Java 索引
java基础扫盲-String类常用的方法
java基础扫盲-String类常用的方法
|
20天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
17 0
下一篇
无影云桌面