首页 > 编程语言 >Java按值调用和按引用调用的区别

Java按值调用和按引用调用的区别

时间:2023-05-04 17:55:05浏览次数:39  
标签:调用 Java 按值 int number value num call method

  Java中函数参数传递的方式分为按值调用和按引用调用两种。这两者之间主要区别在于原始变量或对象是否能够被修改。

  • 按值调用:当将一个基本数据类型(例如,int、char等)作为参数传给函数时,实际上传递了该变量的副本而不是真正意义上的“指针” 或 “引用”。因此,在方法内部对形参进行更改并不能影响到外面实参所代表原有存储空间内容。

  以下示例展示了通过方法尝试更改Java int型输入数值计算结果:

public class Main {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("Before method call, the value of 'number' is: " + number);
        
        changeNumber(number);
        
        System.out.println("After method call, the value of 'number' is still unchanged. It's: " + number);    
    }
    
    private static void changeNumber(int num){
      num *= 2; // 对num执行操作,并无法同步更新旧元素位置指向新地址信息;
    }  
}

输出如下:

Before method call, the value of 'number' is: 5
After method call, the value of 'numberisechsunchanged.Itis:5.

  从运行结果来看,即使我们在changeNumber() 方法里做出了处理,num 的最终句柄仍然与其初始赋予权限声明那样指向同一个内存地址。原因在于:

  Java会为基本数据类型分配一块连续的物理空间来储存该变量,所以当将其传递给函数时实际上是复制了这个值并且放到另外位置中去。

  • 按引用调用 :而对数组、对象或集合等非基元素变量进行操作时我们通常能感观察指针与内容副本不易区别开,此种情况下更倾向称之为“按照引入方式”,意思就如你通过建立某些事务属相关联从而能直接地访问似得。(注意: Java 中没有真正的指针)

  以下是使用自定义类作为参数(即非固定位数整型)进行方法取反示例:

package Test;

public class Test {
  public static void main(String[] args) throws Exception{       
      // 创建Number封装主体数字 
       final Number numberHolder = new Number(5);
        
        System.out.println("Before method call, the value is: " + numberHolder.getValue());
        
// 对象形式输入进changeNum() 方法先后经历:
         //number 句柄拷贝;
         //新创建MyInteger对象(heap 推断可知),初始化value属性和根据new产生返回校验号码推算出myIntHandle 地址,并覆盖控制信息部分新内存;
         //将MyInteger对象的句柄 myIntHandle 传递给形参nun,并完成数据类型一致化;
 
      changeNumber(numberHolder);
      
        System.out.println("After method call, the value has been changed to: " + numberHolder.getValue());
    }
    
   private static void changeNumber(Number num){
       final int temp = -num.value;
       
// 下面操作即为对原有引用所指向地址空间进行修改:
       num.value = -temp;     
   }  
}

class Number{
    int value;

    public int getValue() {
        return value;
    }

    public Number(int n) {
        this.value = n;
    }
}

输出如下:

Before method call, the value is: 5
After method call, the value has been changed to: 5

  从运行结果来看,changeNumber() 方法中虽然仅采取了简单的整型数值计算和复合赋值方式处理入层次数字体系信息,但是在这个过程中它依旧成功地改变了输入参数 numberHolder 所固定“连续物理授位”的内容。

  总之:按照调用者与被调函数声明要求不同程序允许我们以两种主流方案去实现相关预期功能,需要具体情况而分。

标签:调用,Java,按值,int,number,value,num,call,method
From: https://www.cnblogs.com/SwapEnd/p/17371906.html

相关文章

  • python调用c程序
    C代码文件名《task.c》#include<stdio.h>inttask(intn,intp,intm){ inti,j,k; unsignedlongs=0; for(i=0;i<n;i++){ for(j=0;j<p;j++){ for(k=0;k<m;k++) { s=s+i+j+k; } }} returns;}编译在task.c文件目录上打开命令行......
  • 想了解JavaScript基础?这篇文章足够了!
    本人无意看到的一篇文章,觉得写的很全面,简单概括了Javascript的一些知识,现分享如下:原文地址:http://www.ppmy.cn/news/7295.html更多详细内容,请微信搜索“前端爱好者“,戳我查看。一、JavaScript的介绍JavaScript是一种运行在客户端的脚本语言,作为web标准的行为层,最初出现......
  • 简单了解javabean
    来自你的消息:javabean怎么理解来自ChatAI的消息:JavaBean是指符合一定规范的Java类,用于封装数据。JavaBean一般包含私有属性、公有getter/setter方法和无参构造方法。JavaBean的主要目的是提供一种规范化的方式来创建可重用的组件,这些组件可以用于在Java程序中进行数据封装、......
  • javascript-1
    js注释多行注释/*这里是注释*/单行注释//这里是注释js中严格区分大小写js中每一条语句以分号结尾,如果不写分号,浏览器会自动添加。......
  • Java 数组、List初始化赋值
    1数组初始化赋值//第一种初始化赋值方式String[]strs1={"1","2"};//第二种初始化赋值方式String[]strs2=newString[]{"1","2"};2List初始化赋值//第一种初始化赋值方式List<String>strList1=Arrays.asList(newString[]{"1","2"});......
  • 12 11 | 反应式编程框架设计:如何使方法调用无阻塞等待?
    你好,我是李智慧。反应式编程本质上是一种异步编程方案,在多线程(协程)、异步方法调用、异步I/O访问等技术基础之上,提供了一整套与异步调用相匹配的编程模型,从而实现程序调用非阻塞、即时响应等特性,即开发出一个反应式的系统,以应对编程领域越来越高的并发处理需求。反应式系统应该具......
  • 面试题 02.07(Java). 链表相交(简单)
    题目:本题与:力扣160相交链表一致给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构......
  • vue 原生方法实现pc端调用摄像头全屏视频考试(实时截屏上传,并提示当前环节
    <template><div><el-row><el-col:span="10"style=""><div><el-cardstyle="margin:0;padding:0;overflow-y:auto"><divstyle="width:100......
  • 【java】定时器
     定时器的实现方式:线程等待实现:最原始最简单的方式,先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。 publicclassTask{publicstaticvoidmain(String[]args){//runinasecondfinallongtimeInterv......
  • [Javascript] Proxy - Snippets
    Blog:https://dev.to/marclipovsky/discovering-the-power-of-javascript-proxy-after-all-this-time-4627 Lazyloading:constlazyLoadHandler={get:function(target,property){if(!target[property]){target[property]=expensiveComputation(......