【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


相关文章
|
1天前
|
Java 程序员
Java this关键字详解(3种用法),Java程序员面试必备的知识点
Java this关键字详解(3种用法),Java程序员面试必备的知识点
|
1天前
|
Java Kotlin
关于Java:public函数公开其public / * package * /’参数类型
关于Java:public函数公开其public / * package * /’参数类型
9 3
|
1天前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
5 0
|
2天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
14 4
|
2天前
|
Java 编译器 C语言
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
12 3
|
2天前
|
算法 Java 数据安全/隐私保护
【Java开发指南 | 第二篇】标识符、Java关键字及注释
【Java开发指南 | 第二篇】标识符、Java关键字及注释
13 5
|
2天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
57 2
|
2天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
10 0
|
2天前
|
Java
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
7 0
|
2天前
|
存储 Java 编译器
【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制
【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制
45 0