【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


相关文章
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
21天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
14天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
27 2
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
22天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
15 2
|
22天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
15 1
|
16天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
11月前
|
Java
【零基础学Java】—final关键字与四种用法(二十九)
【零基础学Java】—final关键字与四种用法(二十九)
|
6月前
|
Java
Java中final关键字(看这篇就够了)
Java中final关键字(看这篇就够了)
57 0
|
4月前
|
Java
Java面向对象 ( 多态 | final关键字 | 接口 )
Java面向对象 ( 多态 | final关键字 | 接口 )