java程序设计语言是按值调用还是按引用调用?

  1. public void updateHeightAndPrint(int height,Student student){
  2. height+=height;
  3. System.out.println("Student:"+student.toString());
  4. }
  1. public static void main(String[] args) {
  2. int a = 10;
  3. int b = 10;
  4. increaseAndPrint(a,b);
  5. System.out.println("调用increaseAndPrint()后:a:"+a+",b:"+b);
  6. }
  7. /**
  8. * 增加5并打印输出
  9. */
  10. public static void increaseAndPrint(int c,int d){
  11. c = c + 5 ;
  12. d = d + 5 ;
  13. System.out.println("cIncreaseResult:"+c+",dIncreaseResult:"+d);
  14. }

结果为:

image.png

increaseAndPrint()方法调用过后,int a,b的值还是10,可以得出一个方法不可能修改一个基本数据类型的参数。(注意:在调用过程中c被初始化为a值的一个拷贝,d被初始化为b值的一个拷贝,重要的事情多三遍,传递的是值的拷贝、值的拷贝、值的拷贝

  1. public static void main(String[] args) {
  2. Student wali = new Student("wali", 170);
  3. Student jack = new Student("jack", 180);
  4. increaseHeight(wali,jack);
  5. System.out.println("wali:"+wali.toString()+",jack:"+jack.toString());
  6. }
  7. public static void increaseHeight(Student w,Student j){
  8. w.setHeight(w.getHeight()+10);
  9. j.setHeight(j.getHeight()+10);
  10. }

结果:

image.png

可以看到改变一个对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝。方法在运行过程中,w为wali对象引用的拷贝,j为jack对象引用的拷贝,也就是说w和wali、j和jack这俩个引用指向的是同一个对象,所以在w.setHeight(w.getHeight()+10)执行后wali对象的height属性变更了,而当方法结束后,w和j都不在使用,当然wali和jack继续引用那个Height被增加了10的对象。

  1. public static void main(String[] args) {
  2. Student wali = new Student("wali", 170);
  3. Student jack = new Student("jack", 180);
  4. swap(wali,jack);
  5. System.out.println("交换后wali:"+wali.toString()+",jack:"+jack
  6. .toString());
  7. }
  8. public static void swap(Student w,Student j){
  9. Student temp=w;
  10. w=j;
  11. j=temp;
  12. System.out.println("swap中:");
  13. System.out.println("wali:"+w.getName());
  14. System.out.println("jack:"+j.getName());
  15. }

结果:

image.png

如果java采用的是引用传递那么调用这个方法就应该能够改变wali和jack引用。然后结果并不是我们想象的那样。最终白费力气,在方法结束时w和j被丢弃。原来的变量wali和jack仍然引用方法调用之前所引用的对象。

  • 一个方法不能修改一个基本数据类型的参数(即数值型,或布尔值)
  • 一个方法可以改变一个对象的参数的状态
  • 一个方法不能让对象参数引用一个新的对象。

文章标签:

原文连接:https://juejin.cn/post/7109778929912643614

相关推荐

领域驱动设计:事件溯源架构简介

Figma自编教程第三篇(也是做产品实习生的第三天)

Flutter 绘制探索 | 箭头端点的设计

为什么设计的软件不好用?那是因为不熟悉软件开发模型!一文熟悉软件开发模型

Netty 案例之 IM 方案设计

【设计模式】责任链模式(Chain of Responsibility Pattern)

VGA设计(原理说明。Verilog代码实现,仿真结果)

提升UI产品体验的14个细节!你都知道吗?

【毕业设计】深度学习 opencv python 实现中国交通标志识别

TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2

还记得当年的超级玛丽么?来吧,动手设计一款小霸王游戏机

Figma自编教程第二篇(也是做产品实习生的第二天)

【毕业设计】python+大数据构建疫情可视化分析系统

Go的错误处理设计

Figma自编教程第一篇(也是做产品实习生的第一天)

【设计模式】模板模式,学会它咱也写出优雅健壮的代码!

从全局角度,如何设计一个秒杀系统?

【分享】从Mybatis源码中,学习到的10种设计模式

【干货】MySQL底层架构设计,你了解多少?

【C++】从设计原理来看string类