精华内容
下载资源
问答
  • 值传递和引用传递(地址传递)的区别

    千次阅读 2019-08-07 10:38:05
    值传递和引用传递(地址传递)的区别 也许大家对于被值传递和引用传递(看了些别人的博客也有人说只有值传递)弄得傻傻分不清楚,我个人之前也是这样过来的,自己也思考了一番,后来才弄清楚了,结合大多数人的想法...

    值传递和引用传递(地址传递)的区别

    也许大家被值传递和引用传递(看了些别人的博客也有人说只有值传递)弄得傻傻分不清楚,我个人之前也是这样过来的,自己也思考了一番,后来才弄清楚了,结合大多数人的想法总结:

    八大基本数据类型:(byte, boolean, char, short, int, long, float, double)

    值传递

    引用类型:(数组, 类, 接口)

    地址传递

    我觉得大家也都知道以上的知识点,但是面对编程题还有自己写编程的时候还是出现了返回的值到底是多少的问题,下面是个人用代码编写的程序:

    编码实现的功能是在数组的任意位置插入一个整形数值。

    System.out.println(arr)是为了调试信息(显示在堆空间的地址)添加的。

    package com.sxt.www;
    import java.util.Arrays;
    
    public class Text01_insert {	
    public static void main(String[] args) {
    	int[] arr = new int[]{11, 22, 33, 44, 55};
    	System.out.println(arr);
    	System.out.println(Arrays.toString(arr));
    	insertPosition(arr,2,66);
    	System.out.println(Arrays.toString(arr));
    }
    public static void insertPosition(int[] arr,int index,int num) {
    	int[] newArr = new int[arr.length + 1];
    	System.out.println(newArr);
    	System.arraycopy(arr, 0, newArr, 0, index);
    	newArr[index] = num;	
    	System.arraycopy(arr, index, newArr, index + 1, arr.length -index);
    	
    	arr = newArr;
    	System.out.println(arr);
    }
    }
    

    执行结果如下:

    [I@1554909b
    [11, 22, 33, 44, 55]
    [I@6bf256fa
    [I@6bf256fa
    [11, 22, 33, 44, 55]
    

    显而言之,虽然它是数组,属于引用类型,但是传回来的值竟然没有变化,是不是感觉违反了一开始总结的知识点,细看代码可以发现,形参里传入了实参的数组,就表明复制了一份变量名为arr的数组给了insertPosition(),当我们在主方法打印数组元素的时候,复制后的代码的确发生了改变,实际上打印的是复制前的原件,所以还是原来的数组元素。

    insertPosition方法作用完之后会释放栈空间,而非改变主方法中的arr。

    接下来看一下以下面的代码,只是改了一下位置,定义了一个全局变量arr数组。

    public class Text01_insert {

    	static int[] arr;
    public static void main(String[] args) {
    	arr = new int[]{11, 22, 33, 44, 55};
    	System.out.println(arr);
    	System.out.println(Arrays.toString(arr));
    	insertPosition(2,66);
    	System.out.println(Arrays.toString(arr));
    }
    public static void insertPosition(int index,int num) {
    	int[] newArr = new int[arr.length + 1];
    	System.out.println(newArr);
    	System.arraycopy(arr, 0, newArr, 0, index);
    	newArr[index] = num;	
    	System.arraycopy(arr, index, newArr, index + 1, arr.length -index);
    	
    	arr = newArr;
    	System.out.println(arr);
    }
    }
    

    运行结果如下:

    [I@6cd8737
    [11, 22, 33, 44, 55]
    [I@22f71333
    [I@22f71333
    [11, 22, 66, 33, 44, 55]
    

    上面只做了参数的变化,就将值传递变为了地址传递,因为newArr将自身的地址值传递给了全局变量arr,所以按照main主方法的顺序原则下,打印出来的结果就是地址传递后的结果,换句话说全局变量int[] arr的地址从原来分配给的地址[I@6cd8737经过newArr的地址传递后变成了[I@22f71333,所以newArr的值为多少,arr的值就为多少。

    图解法:

    地址传值

    总结

    具体问题该具体分析,只要注意它是否传的是地址,然后判断传的地址是否一样,是不是两个不相同的地址就可以辨别出来了,利用图解法可以更容易的进行理解。

    展开全文
  • java引用传递和值传递的详细探讨

    万次阅读 多人点赞 2015-12-09 18:22:47
    问题来源于一道广泛的面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 为了解决这个问题,查阅了各种资料,却发现没有统一...

    问题来源于一道广泛的面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    为了解决这个问题,查阅了各种资料,却发现没有统一的结果,因此只能从我自己的角度给出一个答案。欢迎大家探讨这个问题。

    根据Horstmann的《java核心技术》(中文第8版P115-P117)的描述,java中是没有引用传递的,原文摘录如下:
    ”java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。“

    ”有些程序员(甚至是本书的作者),认为java程序设计语言对对象采用的是引用调用,实际上这种理解是不对的。”

    首先明确一下值传递和引用传递的概念:
    值传递:表示方法接收的是调用者提供的值。
    引用传递:表示方法接收的是调用者提供的变量地址。

    下面这段代码中,显而易见,percent的值是不会改变的。

        double percent=10;
        editPercent(percent);
        System.out.println("方法结束后的percent:"+percent);
    
        public static void editPercent(double x){
            x=3*x;
            System.out.println("方法内的X:"+x);
        }

    而在以下这段代码中,传递了一个Emplyee对象,通过调用方法,改变了Employee对象的属性。

        Employee boss= new Employee("boss", 5000);
        editSalary(boss);
    
        public static void editSalary(Employee x){
            x.raiseSalary(200);
            System.out.println("方法结束后的Salary:"+x.getSalary());
        }

    第一段代码,其执行过程如下:
    (1)x被初始化为percent的一个拷贝(10)
    (2)x被乘3,但是percent不变
    (3)方法结束后,参数变量x不再使用。

    第二段代码,其执行过程如下:
    (1)x被初始化为boss的拷贝,是一个对象的引用
    (2)editSalary应用于这个对象的引用,这时x修改了这个对象,这时boss也引用同一个对象,这个对象的salary被提高了200%
    (3)方法结束后,参数变量x不再使用,boss继续引用已经被修改的Employee对象。

    可以发现,当传递一个对象参数时,java对其的操作时近似引用传递的。这也是引发争论的关键点。事实上,尽管《java核心技术》中阐述java不存在引用传递,依然有许多人认为java中存在引用传递。以下是一个极易引发争论的程序。

    public class Example {
        String str = new String("good");
        char[] ch = { 'a', 'b', 'c' };
        public static void main(String args[]) {
            Example ex = new Example();
            //执行了这一句之后
            ex.change(ex.str, ex.ch);
            //ex的str属性没变,但是ch属性被修改了
            System.out.print(ex.str + " and ");
            System.out.print(ex.ch);
        }
    
        public void change(String str, char ch[]) {
            str = "test ok";
            ch[0] = 'g';
        }
    }

    这段程序输出了什么呢?

    good and gbc      ch被方法修改了而str没有被修改。
    

    很明显,str和ch[]都是对象传递,传递到方法中的是一个引用了对象的拷贝。那么为什么char[]被修改了而String没有被修改呢。
    问题出在

    str="test ok"
    

    字符串由于其特殊性,实际上方法中的拷贝对象str在执行完str=”test ok”后,就已经指向了test ok,而原来的ex对象依然指向good,并没有受到影响。
    而char[]对象的拷贝,直接修改了char[0]保存的内容,这时ex对象的属性和方法拷贝依然指向同一个对象,因此当这个对象被方法拷贝修改后,ex受到了影响。

    总结起来,java中参数传递情况如下:
    · 一个方法不能修改一个基本数据类型的参数
    · 一个方法可以修改一个对象参数的状态
    · 一个方法不能实现让对象参数引用一个新对象

    下面使用《java核心技术》的一段代码解释为什么java中不存在引用传递:编写一个交换对象的方法:

    Employee a=new Employee("tom", 7000);
    Employee b=new Employee("jerry", 4000);
    
    public static void swap(Employee x,Employee y){
        //交换两个员工的姓名
        Employee temp=x;
        x=y;
        y=temp;
    }
    

    如果java使用的是引用传递,那么swap方法应该可以实现交换两个对象值的效果,然而最终结果是,swap并没有改变存储在a和b中的对象引用。swap方法的参数x,y被初始化为两个对象引用的拷贝,这个方法交换的是两个拷贝,最终没有实现交换的结果。

    总结:尽管在《核心技术》中有明确的表述java使用的是值传递,但是java在给方法传递一个对象参数时,具体的行为已经很难界定是值传递还是引用传递了。毕竟,如果从行为上来界定,很难说传递对象参数不符合引用传递的定义。

    因此,如果开篇题目是一道简答题,你可以把自己对java参数传递的理解从容的描述清楚,相信面试官会给你一个满意的分数。如果这道题被做成一个选择题,不同的理解方式会有不同的答案,只能说明面试官自己准备都不充分,就算答得不对,也无关紧要。这样的公司,不去就不去了,没啥好遗憾的。

    展开全文
  • lua 值传递,引用传递注意事项

    千次阅读 2018-08-04 10:58:58
    最近项目中lua编写居多,lua作为作为游戏人必备的语言之一,特性就不描述了,在此就发现许多参数传递中的坑,特此记录下 lua中参数传递分为两种 : 1.值传递重新拷贝一份赋给新变量,即新变量拥有全新...

    最近项目中lua编写居多,lua作为作为游戏人必备的语言之一,特性就不描述了,在此就发现许多参数传递中的坑,特此记录下

            

    lua中参数传递分为两种 :

                1.值传递

                       将值重新拷贝一份赋给新变量,即新变量拥有全新的内存地址,与原来的值无关联,改变新变量不会影响老变量的值

                 2.引用传递

                     引用传递则与值传递相反,引用传递,每次赋值时,只是将内存地址的引用赋值给新变量,新旧变量共同引用同一个                   值,指向同一块内存的值,改变新变量得值,即是改变了内存地址中的值,老变量中的值也跟着改变

     在lua中除了table是引用传递外,其余基本都是值传递:

    例如: 引用传递

    local temp_table = {
        
        "张三",
        "李四",
        "王五",
        "赵六",
        "钱七",
    }


    local new_table = temp_table

    for i,v in ipairs(temp_table) do
        if v == "王五" then
            table.remove(new_table, i)

            break
        end
    end

    for i,v in ipairs(temp_table) do
        print(i,v)
    end

    输出结果为

    1    张三
    2    李四
    3    赵六
    4    钱七
    [Finished in 0.6s]

    值传递

    local str = "张三李四王五赵六"

    local new_str = str

    new_str = string.gsub(new_str,"王五","隔壁老王")

    print(str,new_str)

     

    输出结果 

    张三李四王五赵六    张三李四隔壁老王赵六
    [Finished in 0.1s] 

    展开全文
  • Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++C#中可以...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

    是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值,但是在Java中却做不到。

    说明:Java中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从C和C++转型为Java程序员的开发者无法容忍。

    展开全文
  • c# Form之间进行值传递问题(参考)

    千次阅读 2015-01-26 21:56:45
    在c#中,有时候会出现需要在2个Form中进行数据传递的问题,具体的说就是:我们往往需要把Form2中TextBox,Label,ComBox等控件的值传递给Form1类使用,网上也有许多做法,说的有的比较难理解,这里介绍一种比较容易...
  • 结构数组的差异(基本概念)  为结构编写函数比为数组编写函数要简单得多。...然而,按值传递结构有一个缺点,就是结构非常大的情况下,复制结构将增加内存要求,所以更倾向于传递地址, 使用指针进行传递,C++...
  • 然后你就会看到如下这个设计窗体: 设计一下窗体的控件变成如下这个效果: 设计完窗体效果,然后我们就可以写事件了 ...鼠标双击取消按钮控件打开事件编辑器写click事件: ...然后我们的值传递就写好了
  • 函数参数的传递和值返回  前言: 前面我们说的都是无参数无返回值的函数,实际程序中,我们经常使用到带参数有返回值的函数。 一、函数参数传递 1.形式参数实际参数 函数的调用把一些表达式作为参数...
  • 1 参数传递 (1)如果不想把参数放在一个对象内封装,使用多个参数。 Dao接口层方法传参: Integer selectAnnualSales(@Param("tenantId")String tenantId,@Param("beginDate") String beginDate,@Param(...
  • 代码编写规范

    万次阅读 多人点赞 2019-04-23 22:48:44
    排版格式2.1 类及其排版格式2.2 函数的声明与定义2.3 空行2.4 代码行2.5 代码行内的空格2.6 对齐2.7 长行拆分2.8 修饰符的位置2.9 代码段中的预处理格式2.10 被注释的代码2.11 注释3.命名规则4.表达式基本语句4.1 ...
  • 在程序设计语言中,将参数传递分为按调用按引用调用。按调用:表示方法接收的是调用者提供的。而按引用调用表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量,而不能修改传递...
  • 本文提供了在使用node-addon-api编写c/c++扩展时,由js向c++传递复杂类型时遇到的各种情况。其他基础知识就不赘述了,这篇文章讲的不错,不熟悉Node.js编写扩展的同学可以了解下。 官方给出了很多简单的例子以供参考...
  • 今天遇到这样一个问题,需要在一个GUI界面输入几个控制变量来控制一个本来已经写好的...GUI界面变量值传递到其他.m文件 1.在GUI界面的“可编辑文本”上点击右键,选择“回调函数”。 2.在对应的回调函数中定义之后在...
  • ubuntu下eclipse cdt 编写C/C++代码时,如果main函数的argv[]字符数组需要传值(命令行可以直接在程序后带参数),需要通过如下设置:  —右键工程,选择Run as->Run Configurations...,  —选择...
  • java 传递参数的两种方式

    万次阅读 多人点赞 2015-10-19 15:39:28
    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能  值传递:方法调用时,实际参数把它的值传递给对应...
  • Unity调用C++编写的dll传递数组

    千次阅读 2018-04-13 12:52:49
    主要是最近在Unity里想调用一个自己用C++写的dll,然后传递一下数组。...具体的怎么建dll工程就不说了,只记录一下部分比较重要的代码,大概之后能看懂意思,再照着改就好了。C++的代码如下,首先...
  • Qt入门学习——Qt快速入门(vim纯代码编写

    万次阅读 多人点赞 2015-08-26 11:15:30
    写完代码后,我们需要通过g++编译器(C++编译器)把此代码编译为可执行程序,但由于此代码使用的函数不是C++标准库,而是Qt库,编译时需要指定其所依赖的Qt库,这样比较麻烦。我们可以利用Qt提供的qmake工具来编译Qt...
  • GolangErlang消息传递机制对比

    千次阅读 2015-12-11 15:25:22
    上一篇文章介绍了 Go Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制简要对比ErlangGo虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erlang的轻量进程,Go的Goroutine...
  • 控制器向视图传递值(二)

    千次阅读 多人点赞 2020-05-23 15:48:08
    1.新建ASP.NET MVC应用程序,选择“空”模板,添加HomeController控制器Index.cshtml视图页面。 2.选中Models文件夹,添加右键“添加—新建项”,弹出添加新项对话框,如图所示: 3.选择“数据”菜单,点击“ADO...
  • 目录 一、互调的基本原理 二、基本数据类型的传递 三、指针的传递 四、函数指针的传递 ...最近在编写Warensoft3D游戏引擎,并预计明年年初发布测试版本,底层引擎使用DirectXMONO来编写,上层...
  • 我们知道形参的改变并不能改变对应实参的,把数据从被调用函数返回到调用函数的唯一途径是通过return语句返回函数值,这就限定了只能返回一个数据。但是通过传送地址,可以在被调用函数中对调用函数中的变量...
  • 此时AIDL可以为你解决,但是AIDL中,默认传递的类型不多(String,Char,Int,Long,Bool...)但是如果传递一个User呢? 在AIDL跨进程的处理中并不允许之间传递一个类,而是需要把类进行序列号进行传递,而后再反...
  • iOS开发实现页面间的数据传递

    千次阅读 2015-07-28 19:53:58
    在两个页面之间传递数据是App中最基本的需求,如何在进行页面跳转的时候把数据也传递过去,这是我们今天要实现的问题。想想在Android中我们使用Intent或者Bundle来传递数据,在iOS中我们应该怎么样呢?
  • 这两天写了两个实现matlab的gui的程序,其中涉及到不少参数传递的问题,涉及到不同窗口之间、不同控件之间参数的传递,从实现原理方面,又分为guide实现gui时的参数传递问题和编写代码实现gui的参数传递问题。...
  • 要点: *(1)ObjectInputStream...*(2)使用ObjectInputStreamObjectOutputStream来包装底层网络字节,TCP服务器TCP客户端之间就可以传递对象类型的数据。 代码实现 import java.io.*; import java.n
  • 最近开始接触到一个挺老项目,其中涉及到了一些jsp代码编写, 其中遇到一个问题比较麻烦,就是在jsp页面中iframe 的src属性动态修改的问题 页面:hello.jsp,table.jsp 页面上有三个标签:text,button,iframe ...
  • 这是我在开发多层体系结构时遇到的问题,由于VS.NET尚不支持各种数据类型的空值即null,放入实体类中在各个层之间作为参数传递,所以经查询参考SQL Server 2000的联机丛书.NET的MSDN Library以及在编写代码生成时...
  • 通过制造一个返回值为函数的函数调用,我们可以明确的按值传递我们想要绑定的。这允许我们在循环中初始化一系列 selObj 对象。  selObj.onchange = function (i) {  return function () {  ...
  • 接着上篇文章来,我们这次来尝试传递Checkbox 数据。 我们知道,复选框 checkbox 可以传递一个甚至多个数据,所以重要程度就不言而喻了。咱们接下来需要将以下代码保存在test.htm文件中: <!DOCTYPE ...
  • 如果在文章中发现代码错误或其它问题请告知,感谢! 0x01准备工具: 1.cheat engine: https://www.cheatengine.org/ 2.Visual Studio 2010 3.植物大战僵尸 0x02实现过程 1.思路 我们打开的每一个程序中,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 508,875
精华内容 203,550
关键字:

值传递和比较传递代码编写