如何理解java方法的传值和传引用的参数传递方式(基本数据类型和引用类型)

结论:1)当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值2)当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,则会对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;3)当使用引用数据类型作为方法的形参时,若在方法体中修改形参变量的指向,此时不会对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区例一:基本数据类型作为形参,运行结果不改变实参publicclassMain{publicstatic

大家好,又见面了,我是你们的朋友全栈君。

结论:

1)当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值
2)当使用引用数据类型作为方法的形参时,若在方法体中 修改形参指向的数据内容,则会对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;
3)当使用引用数据类型作为方法的形参时,若在方法体中 修改形参变量的指向,此时不会对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区

例一:基本数据类型作为形参,运行结果不改变实参

public class Main { 
   
    public static void main(String[] args) { 
   
        Person p = new Person();
        int n = 15; // n的值为15
        p.setAge(n); // 传入n的值
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改为20
        System.out.println(p.getAge()); // 15
    }
}

class Person { 
   
    private int age;

    public int getAge() { 
   
        return this.age;
    }

    public void setAge(int age) { 
   
        this.age = age;
    }
}

例二:引用类型–修改形参指向的数据内容,运行结果改变实参指向的数值,不改变实参地址

public class Main { 
   
    public static void main(String[] args) { 
   
        Person p = new Person();
        String[] fullname = new String[] { 
    "Homer", "Simpson" };
        p.setName(fullname); // 传入fullname数组
        System.out.println(p.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p.getName()); // 是"Bart Simpson"
    }
}

class Person { 
   
    private String[] name;

    public String getName() { 
   
        return this.name[0] + " " + this.name[1];
    }

    public void setName(String[] name) { 
   
        this.name = name;
    }
}

例三:引用类型–修改形参的指向,运行结果,不改变实参的任何东西

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String bob = "Bob";
        p.setName(bob); // 传入bob变量
        System.out.println(p.getName()); // "Bob"
        bob = "Alice"; // bob改名为Alice
        System.out.println(p.getName()); // "Bob"
    }
}

class Person {
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129758.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Docker卸载_退出docker容器命令

    Docker卸载_退出docker容器命令##1)进入docker的安装目录cd/usr/local/bin/##2)删除与docker相关的文件夹sudorm-rfdocker*sudorm-rfcom.docker.*sudorm-rfhub-tool*sudorm-rfkube*sudorm-rfvpnkit*完成!

    2022年9月8日
  • 手机录屏gif制作软件_录屏 gif

    手机录屏gif制作软件_录屏 gif1、ScreenToGif下载:https://www.screentogif.com/2、使用教程https://my.oschina.net/u/4264749/blog/3555825

    2022年9月20日
  • matlab设计模拟带通滤波器

    matlab设计模拟带通滤波器简单记录下在matlab上如何设计出模拟的带通滤波器,包括:巴特沃斯滤波器、切比雪夫I型滤波器、切比雪夫II型滤波器、椭圆型滤波器。代码如下:%设计带通滤波器%巴特沃斯、切比雪夫I型、切比雪夫II型

    2022年7月2日
  • 3个国内最大的黑客学习网站

    3个国内最大的黑客学习网站1、i春秋国内比较好的安全知识在线学习平台,把复杂的操作系统、工具和网络环境完整的在网页进行重现,为学习者提供完全贴近实际环境的实验平台,地址:https://www.ichunqiu.com/main2、XCTF_OJ练习平台XCTF-OJ(XCaptureTheFlagOnlineJudge)是由XCTF组委会组织开发并面向XCTF联赛参…

    2022年7月15日
  • stm32基础知识必会_护理学基础必考知识点

    stm32基础知识必会_护理学基础必考知识点目录【GPIO外设】一、GPIO的八种工作模式二、总结在STM32中选用IO模式【RCC时钟】【NVIC是嵌套向量中断控制器】一、优先级定义二、优先级分组【EXTI外部中断/事件控制器】【SysTick系统定时器】【通讯的基本概念】一、串行通讯与并行通讯二、全双工、半双工及单工通讯三、同步通讯与异步通讯四、通讯速率【串口通讯】一、物理层:二、协议层【I2C】一、物理层二、协议层【SPI】一、SPI物理层二、协议…

    2022年9月6日
  • SQL学习(二):concat函数(连接字符串)

    SQL学习(二):concat函数(连接字符串)concat函数(连接字符串):使用方法:CONCAT(str1,str2,…)返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型cast,例如:SELECTCONCAT(CAST(int_colASCHAR),char_col)concat函数

    2022年5月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号