java方法参数传递方式只有----值传递!

  在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中,

在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影响到实

际参数本身。但是,在java中只有值传递,没有引用传递!那么,为什么当方法参数是基本数据类型时表现是值传递,

而当是引用类型时表现的是引用传递形式呢?

  Java内存区域中含有java堆和虚拟机栈两个内存区域(并不是只是将java内存区分为这两个内存区域,此外还有程

序计数器,本地方法栈以及方法区),java堆的目的就是为了存放对象,当一个方法执行时,每个方法都会为自己建立

内存栈,用于存放方法内定义的变量等信息,当方法结束,这个方法的内存栈也会被销毁。

  总的来说,java方法运行时存放在栈中而对象本身存在堆中。下面将用两个例子来叙述当方法参数是基本数据类型

时和引用类型时java的值传递过程。

  方法参数为基本数据类型时:

  可以看出,在main方法中调用swap方法传递的a,b参数仅仅是a,b副本,并不不是a,b本身,下面将java内存空间的

情况,进一步说明java方法参数的值传递。

  当main方法开始执行时,创建main方法栈,栈中存储了a,b两个变量,值分别为9,20。main调用swap方法,并传递a,

b的副本给swap方法,swap方法创建自己的栈区,里面有a,b和temp,此时的内存区中存在5个临时变量,在swap中将a,b

进行交换,当swap方法结束后,swap栈区被销毁,从始至终,main栈区中的a,b未受到影响,直至main方法结束,main栈

区销毁。所以java传递的只是参数的副本而非参数本身。

  而当参数是引用类型时:

  从上面的例子看出,当参数类型为引用时,原始参数受到了影响,那是否就是进行了引用传递呢?答案是否定的,参数

还是进行的值传递。

  在main方法中有testValueTransfer引用变量,它保存在main方法栈中,新new的TestValueTransfer对象则保存在java堆中

,testValueTransfer实际存储的是对象的地址指向对象。当在main方法中调用swap方法时,传递的是testValueTransfer引用变

量的副本,此时内存区中存在两个变量指向TestValueTransfer对象,当在swap方法中交换对象中的a,b成员变量时,实际操作

的是对象本身,因此当swap方法结束后,main方法中testValueTransfer指向的对象发生了变化。

  总结:java参数传递方式只有值传递一种方式而已,传递的参数一直都是原始参数的副本。

原文地址:https://www.cnblogs.com/lin0/p/12356607.html

时间: 2024-12-31 13:59:07

java方法参数传递方式只有----值传递!的相关文章

辨析Java方法参数中的值传递和引用传递

小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. public class MethodParamsPassValue { public static void doErrorHandle() { boolean a = false; int b = 5; passBaseValue(a, b); if (a == true || b == 10) { S

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

java方法参数传递面试题

传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static void changeValue(int value){ value = 0; } public static void main(String[] args) { int value = 2010; changeValue(value); System.out.println(value); } }

【Java】关于Java中参数传递方式与C++的比较

[写作原由] 今天刚刚刷了一道二叉树路径搜索的题(LeetCode 113 Path Sum II),在采用熟悉的C++解答之后,用Java语言再次撸了一遍,发现一些问题,特别是参数传递的问题: [C++] 在C/C++中,参数传递分为两种:值传递和地址传递,其中: 1.值传递:实际参数将值传递给形式参数,对形式参数进行操作不影响实际参数,如: int main() { int temp=100; printf("before:%d",temp); add1(temp); printf

方法的参数值和值传递机制

1 可变个数的形参的方法: 如: public void print(int i, String...args) 调用: t.print(3,”hello we”,”god like”); 2 java的参数传递机制: 值传递 (1)形参是基本数据类型的:将实参的值传递给基本数据类型的变量 public static void main(String[] args) { TransParam1 t = new TransParam1(); int i=33; int j=45; System.o

254 在js调用函数时,传递变量参数时, 是值传递还是引用传递

问题: 在js调用函数时,传递变量参数时, 是值传递还是引用传递 理解1: 都是值(基本/地址值)传递 理解2: 可能是值传递, 也可能是引用传递(地址值) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02_关于数据传递问题</title> </head> <body> <

Java学习(八)方法参数传递方式

package cn.com.postel.wbb.javaextends; /** * java中的方法的参数传递方式只有一种:值传递. * 所谓的值传递就是将实际数值复制一份传入到方法内,而参数本身不会受到影响. * @author wubinbin * */ public class ValueTrans { public static void main(String[] args) { int a = 1; int b = 2; swap(a, b); System. out.prin

java之方法的参数传递(值传递和引用传递)

方法,必须有其所在类或对象调用时才有意义,若方法有参数: 形参:方法声明时的参数: 实参:方法调用时实际传给形参的参数值: java的实参如何传入方法呢? 首先要明确:变量分为两大类:基础数据类型.引用数据类型. 基础数据类型参数传递方式只有一种:值传递.即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响: public class Test{ public static void test(int i) { i = 6; System.out.println(i); } public

java 学习中遇到的问题(一)方法调用中的值传递和引用传递

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值.引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值. java的方法中,若参数是一般的数值型,例如int,float(包括Integer,Double这些自动装箱的基本类)等,这属于值传递,形参的变化不会影响实参: 若参数是一个对象,