Java 中如何将一个类中方法的局部变量在另一个方法中调用?

news/2024/6/18 19:16:41 标签: 1024程序员节, java

需求背景:

A方法调用B方法,再调到C方法,希望A方法的一个局部变量boolean a,可以在B方法和C方法传递和改变。希望在B方法改变这个变量的值,然后控制其值在C方法的作用。

(1)刚开始是下面这样实现的,但是发现,a的值一直没有变,没有实现我的需求。

public class Test {

    public static void main(String[] args) {
        Test demo = new Test();
        boolean a = false;
        System.out.println(a); // 方法中定义的a初始化是false

        demo.test0(a);//调用方法0()
        System.out.println(a); // 经过方法0之后的  a依旧是false

        demo.test1(a);//调用方法1
        System.out.println(a);// 经过方法1之后的  a依旧是false
    }

    public void test1(boolean a){
        if (a){
            System.out.println(a + "test1" );
        }
    }

    public void test0(boolean a){
        a= true;
    }
}

原因:基本类型的参数传递是按值传递的。在Java中,基本类型的参数传递是将变量的值复制一份传递给方法,而不是传递变量本身。因此,当A方法将变量的值传递给方法B时,B方法对这个值的修改不会影响A方法中原始变量的值。

那继续,那如果基础变量不行,是不是可以考虑成员变量 或者 将变量封装为对象类型,以实现对变量值的共享和修改。

(2)那接下来将基本数据类型boolean修改为Boolean对象是不是就可以了呢?No,这个局部变量的值依旧没有被修改。

public class Test {

    public static void main(String[] args) {
        Test demo = new Test();
        Boolean a = false;
        System.out.println(a); // 方法中定义的a初始化是false

        demo.test0(a);//调用方法0()
        System.out.println(a); // 经过方法0之后的  a依旧是false

        demo.test1(a);//调用方法1
        System.out.println(a);// 经过方法1之后的  a依旧是false
    }

    public void test1(Boolean a){
        if (a){
            System.out.println(a + "test1" );
        }
    }

    public void test0(Boolean a){
        a= true;
    }
}

原因:这是因为在Java中,Boolean对象也是按值传递的。虽然Boolean是一个引用类型,但是它的值是不可变的。在方法B中修改它的值的时候,实际上是创建了一个新的Boolean对象,而不是修改原始对象。  因此无法在方法中直接修改Boolean对象的值。对于Boolean这种包装类对象,它是不可变的,也即是说一旦创建就无法修改其值。

这是因为在Java中,对于不可变对象(如Boolean、String等)每次对其进行修改时,都会创建一个新的对象来代码新的值。原始的对象保持不变,不受修改的影响。这种设计有助于确保对象的不可变性,从而提供更好的安全性和线程安全性。

最后:利用方法返回值传递局部变量的值

public class Test {

    public static void main(String[] args) {
        Test demo = new Test();
        boolean a = false;
        System.out.println(a); // 方法中定义的a初始化是false

        a = demo.test0(a);//调用方法0()
        System.out.println(a); // 经过方法0之后的  a变成true

        demo.test1(a);//调用方法1
        System.out.println(a);// 经过方法1之后的  a变成true
    }

    public void test1(boolean a){
        if (a){
            System.out.println(a + "test1" );
        }
    }

    public boolean test0(boolean a){
        a= true;
        return a;
    }
}


http://www.niftyadmin.cn/n/5119127.html

相关文章

快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解

本文主要介绍快速入门 Elasticsearch,从 安装 、 基本概念 、 分词器 、*** 文档基本操作 *** 这 4 个方面快速入门。 Elasticsearch 是一款近实时的搜索引擎,底层是基于 Lucene 做搜索,再此基础上加入了分布式的特性,以便支持海…

离线电商数仓(二)

数据调研 业务调研:熟悉业务流程,明确每个业务的具体流程,需要将该业务所包含的每个业务过程一一列举出来。将数据和业务过程中的变化过程了解清楚。需求分析:需要明确需求所需的业务过程及维度,例如该需求所需的业务…

少走弯路!彻底学会spring源码应用实战

简介 相信大家能经常性的遇到项目上各类excel的导出,简单的excel格式,用简单的poi,easyExcel等工具都能导出。但是针对复杂的excel,有固定的样式、合并单元格、动态列等各类要求,导致excel 导出需要花很大一部分精力去…

防关联浏览器推荐:MuLogin指纹浏览器安全登录多平台账号

在现今的数字时代,我们的生活离不开互联网。我们使用在线平台进行银行交易、购物、社交媒体互动和其他各种活动。为了保护个人隐私和账号安全,我们需要寻找一种安全且方便的方式来管理我们的在线账号。MuLogin指纹浏览器正是为了满足这些需求而设计的一款…

数学笔记1

目录 1、均值(期望)、方差、协方差 1、均值(期望)、方差、协方差 参考:https://blog.csdn.net/u010087338/article/details/117696482 均值、期望:估算样品集合的平均水平 $$$$

自用——平衡小车代码

编写的文件 encoder.c #include "encoder.h"void Encoder_TIM2_Init(void) {RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;//读数据-浮空输入GPIO_InitStruct.GP…

【代码随想录】算法训练营 第十四天 第六章 二叉树 Part 1

递归遍历 递归法讲究的就是一个格式,在外边再定义一个用于递归求解的函数reverser,参数是递归的二叉树当前根节点和用于保存遍历得到的答案序列的vector容器; 函数中的格式就是,先写递归终止条件,也就是遍历的结点为…

vue自定义全局指令v-emoji限制input输入表情和特殊字符

问题: 后台不提供富文本存储,所以emoji表情入库会报错需求要求前端在输入的时候过滤掉表情符号全局的input 和富文本textarea输入框都需要过滤emoji表情 分析: 1.每一个input写事件写正则校验代码量实在太多了还很麻烦;所以想用…