总的来说,计算机语言给子程序传递参数的方法有两种。第一种方法是按值传递。这种方法将一个参数值(value)复制成为子程序的正式参数。这样,对子程序的参数的改变不影响调用它的参数。第二种传递参数的方法是引用调用。在这种方法中,参数的引用(而不是参数值)被传递给子程序参数。

在子程序中,该引用用来访问调用中指定的实际参数。这样,对子程序参数的改变将会影响调用子程序的参数。你将看到,根据传递的对象不同,Java将使用这两种不同的方法。

在Java中,当你给方法传递一个简单类型时,它是按值传递的。因此,接收参数的子程序参数的改变不会影响到该方法之外。例如,看下面的程序:

// Simple types are passed by value.
class Test { void meth(int i,int j) { i *= 2; j /= 2; }
}
class CallByValue { public static void main(String args[]) { Test ob = new Test(); int a = 15,b = 20; System.out.println("a and b before call: " + a + " " + b); ob.meth(a,b); System.out.println("a and b after call: " + a + " " + b); }
}

该程序的输出如下所示:

a and b before call: 15 20
a and b after call: 15 20

可以看出,在meth( )内部发生的操作不影响调用中a和b的值。它们的值没在本例中没有变为30和10。
当你给方法传递一个对象时,这种情形就会发生戏剧性的变化,因为对象是通过引用传递的。记住,当你创建一个类类型的变量时,你仅仅创建了一个类的引用。
因此,当你将这个引用传递给一个方法时,接收它的参数将会指向该参数指向的同一个对象。这有力地证明了对象是通过引用调用传递给方法的。该方法中对象的改变确实影响了作为参数的对象。例如,考虑下面的程序:

// Objects are passed by reference.
class Test { int a,b; Test(int i,int j) { a = i; b = j; } // pass an object void meth(Test o) { o.a *= 2; o.b /= 2; }
}
class CallByRef { public static void main(String args[]) { Test ob = new Test(15,20); System.out.println("ob.a and ob.b before call: " + ob.a + " " + ob.b); ob.meth(ob); System.out.println("ob.a and ob.b after call: " + ob.a + " " + ob.b); }
}

该程序产生下面的输出:

ob.a and ob.b before call: 15 20
ob.a and ob.b after call: 30 10

正如你所看到的,在这个例子中,在 meth ( )中的操作影响了作为参数的对象。
有趣的一点是,当一个对象引用被传递给方法时,引用本身使用按值调用被传递。但是,因为被传递的值指向一个对象,该值的拷贝仍然指向它相应的参数所指向的同一个对象。

Java基础:参数是如何传递的相关推荐

  1. 【重难点】【Java基础 04】值传递和引用传递、序列化和反序列化

    [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 文章目录 [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 一.值传递和引用传递 1.对比 二.序列化 1.基本概 ...

  2. Java基础4:值传递

    一.前言   本文内容摘自<深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)>一书,2022年出版,作者 张洪亮(@Hollis),阿里巴巴技术专家,著有<Java工 ...

  3. [转载] 由swap引出的java中参数严格值传递问题

    参考链接: Java严格按照值传递 [size=large]博文出处:http://atleeon.com/code/2013/11/28/java-swap-value/ [/size] 晚上看到一 ...

  4. 重学Java(035)——Java基础知识(类作为成员变量、接口作为成员变量、接口作为方法参数和返回值类型)

    学习内容:三种引用类型用法 一.类作为成员变量 二.接口作为成员变量 三.接口作为方法参数和返回值类型 实际的开发中,引用类型的使用非常重要,也是非常普遍的.我们可以在理解基本类型的使用方式基础上,进 ...

  5. java 传入参数_Java 中方法参数的传递

    java中方法参数传递看似有两种,值传递和引用传递.而实际上都是值传递. 所谓值传递,传递的是变量的副本就是说,在将变量a作为参数传进方法中时,方法中接收到的是a的副本,在方法中对参数的修改实际上修改 ...

  6. 【Java基础】Java中的值传递、引用传递

    Java中的值传递.引用传递 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己.--<Java编程思想> 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本 ...

  7. java参数注解pam_吃透Java基础十:注解

    一.什么是注解 官方定义: 注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 注解有许多用处,主要如下: 提供信息给编译器: ...

  8. java 泛型参数_[基础]-Java泛型

    一.概述 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...

  9. Kotlin传递可变长参数给Java可变参数方法

    定义Java可变参数方法 package com.tcl.john.studymvvm.utils;/*** 调用Java方法的工具类* Created by ZhangJun on 2017/10/ ...

  10. 天真,居然还有人认为java的参数传递方式是引用传递

    代码写的越急,程序跑得越慢.-- Roy Carlson 时间过得真快,2020已经过去了一半,但是疫情好像还没有真正的消灭,人们出行还是得带着口罩,天气越来越热,受罪啊. 言归正传,都2020年了, ...

最新文章

  1. DeepMind、哈佛造出了 AI「小白鼠」,从跑、跳、觅食、击球窥探神经网络的奥秘...
  2. Android onMeasure过程分析
  3. 如何按值对字典排序?
  4. Leetcode:Substring with Concatenation of All Words分析和实现
  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI
  6. Python 优先级
  7. DiskFileItemFactory API详解
  8. why object family error message is filtered out
  9. FZU Problem 2030 括号问题
  10. leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
  11. [工具]iperf测试带宽
  12. 【数据结构与算法】顺序栈的Java实现
  13. php 重新编译_linux下为php添加GD库(重新编译php)
  14. hdu 6203 ping ping ping(贪心+树状数组+dfs序)
  15. 计算机基础知识_计算机基础知识汇总
  16. android仿微信图片编辑器,electron/vue可编辑框contenteditable|仿微信截图
  17. JDK神坑:JAVA中Calendar的月份Month少1
  18. GeoDa空间自相关分析和计量模型的权重问题
  19. 微信公众号跳转小程序,详细教程
  20. 【数据可视化工具DataEase】安装时提示 “Pool overlaps with other one on this address space“

热门文章

  1. SQL Server实际执行计划COST欺骗案例
  2. Invalid format of Import utility nameVerify that ORACLE_HOME is properly oracle11.2g 无法imp,dmp
  3. 与我们息息相关的internet服务(2)---WWW服务
  4. 如何引用XML文件生成C#类
  5. Perl Fork的问题
  6. 把解压缩版的tomcat6注册成服务并设置自启动
  7. caffe学习日记--lesson6: 常用的caffemodel下载链接
  8. 命令关闭手机蓝牙_iPhone手机这些实用的便捷功能,你知道多少?
  9. python自动化任务_Python任务自动化工具tox使用教程
  10. mysql数据库的三级模式_数据库的三级模式和两级映射