【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("After1:%d",temp);
        add2(temp);
        printf("After2:%d",temp);
        return 0;
    }
void add1(int x)
   {
        x=x+100;
    }
void add2(int *x)
   {
        *x=*x+100;
    }

将实际参数temp传递给函数add1()中的形式参数x,虽然对x进行了操作,但是并不能影响temp的值,这是因为,temp和形式参数x具备不同的内存空间,即程序运行时,系统为他们分别分配了存储空间,既然空间不同,便不可能相互影响,事实上,temp只是为x进行了初始化而已;

2.地址传递:形式参数为实际参数的地址,即将实际参数的存储空间地址传递给形式参数,形如函数add2(),那么,参数temp和x实际上共用了同一存储空间,对其中任何一个操作都会影响另一个。

【Java】

既然是编程语言,便无可避免参数传递,与C++相比,Java存在明显区别,我们知道Java中不存在指针,也就不存在地址传递,Java的参数传递分为:值传递和引用传递

1、值传递,对于基本数据类型 int,char,float,double等,Java语言为值传递,和C/C++基本一致,不再赘述;

2、引用传递,对于对象类型(数组,容器等各种类对象),Java语言为引用传递,何为引用传递呢?以一个具体的实例来分析:

3、严格地讲,Java参数传递为值传递,详见下文分析。

以下内容引用了文章:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html

public class ParameterTransfer
{
	 public static void main(String[] args)
	 {
	  String[] array = new String[] {"huixin"};
	  System.out.println("调用reset方法前array中的第0个元素的值是:" + array[0]);
	  reset(array);
	  System.out.println("调用reset方法后array中的第0个元素的值是:" + array[0]);
	 }

	 public static void reset(String[] param)
	 {
	  param[0] = "hello, world!";
	 }
}

运行结果:

调用reset方法前array中的第0个元素的值是:huixin
调用reset方法后array中的第0个元素的值是:hello, world!

string是Java的一个类,array是string类的类变量,我们用new方法对其进行了实例化,array称为string对象“huixin”的一个引用;从内存模型的角度来看,内存空间分为两种:栈空间(stack)和堆空间(heap),类变量array和param都存放在栈空间中,而对象“huixin”则存放在对空间中,array称为string对象“huixin”的一个引用,实际上,array存放的是“huixin”的地址,如图所示。当执行reset方法时,我们将类变量array的值传递给了类变量param,那么param中存放的实际上也是“huixin”的地址,即array与param存放的是同一存储空间的地址,严格地讲,这是“值传递”,当我们对param进行操作时,改变的当然也是array所引用对象的值,如图2.

时间: 2024-10-06 17:47:21

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

java中参数传递方式话题终结实例

java新手入门面临的一个经典的话题,本文意在终结这个话题,java中有说法:Java里面参数传递都是按值传递,怎么理解这句话?用文字说明恐怕不容易说明白,说明白恐怕也难以想明白. 前提 先明确一下,按值还是按引用的概念,它是来自c++语言,引用不是汉语词典中的一个词,而是c++的概念--"&"这个符号还记得吧? 为什么有这个话题呢?其一,是对按引用传递理解不透彻:其二,诸多java书籍及讨论论点并没有切中要害.?? 一句话概括,按值传参还是按引用传参,既然是参数传递方式,那么

java中参数传递方式

在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java 应用程序是按值传递对象引用的. 对象是按引用传递的: Java 应用程序有且仅有的一种参数传递机制,即按值传递: 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本: 按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本. Java 应用程

Java中的方法参数传递方式

最近在系统学习Core Java,Java中的数据类型分为两种,第一种是基本数据类型(数字型和布尔型),第二种是类类型(即对象),起初,我以为第一种类型的参数是按值传递,第二种是按引用传递,但在学习Core Java的过程中,我发现这是错误的,先抛出最终结论:在Java中,所有的方法参数都是按值传递的!!!下面来进行解释. 第一种类型的参数是按值调用很好理解,主要是要说明第二种类型的参数也是按值调用的,看下面的一段程序: 1 public static void swap(A x, A y) 2

Java和C参数传递方式的比较

java中的形参是复制实参的一份拷贝(对于引用类型则是复制引用的拷贝,在栈中的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象.[Java只有值传递Java只有值传递Java只有值传递,重要的事情说3遍] 示例代码: public class ExchangeValue { public static void main(String[]

Java函数参数传递方式详解

在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value Java代码   public static class Value { private String value = "value"; public String getValue() { return value; } pub

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中只有值传递,没有引用传递!那么,为什么当方法参数是基本数据类型时表现是值传递, 而当是引用类型时表现的是引用传递形式呢? Java内存区域中含有java堆和虚拟机栈两个内存区域(并不是只是将java内存区分为这两个内存区域,此外还有程 序计数器,本地方法栈以及方

巩固java(六)----java中可变参数方法(非常实用哦)

java提供了可变参数的方法,即方法的参数个数可以不确定,用"..."定义. import java.util.ArrayList; import java.util.List; public class VariableParameter { //求若干个整型数中的最大值 public int getMax(int... items){ //定义可变参数items int max = Integer.MIN_VALUE; //次数为int能表示的最小值,值为-2147483648 f

Java-Spring MVC:JAVA之常用的一些Spring MVC的路由写法以及参数传递方式

ylbtech-Java-Spring MVC:JAVA之常用的一些Spring MVC的路由写法以及参数传递方式 1.返回顶部 1. 常用的一些Spring MVC的路由写法以及参数传递方式. 这是一些测试代码: package com.my.controller; import java.io.PrintWriter; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servl