iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java引用传递的类型有哪些
  • 614
分享到

java引用传递的类型有哪些

2023-06-29 04:06:21 614人浏览 独家记忆
摘要

小编给大家分享一下java引用传递的类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java引用传递的三种类型第一种结果:调用前:50调用后:1000分析

小编给大家分享一下java引用传递的类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    java引用传递的三种类型

    第一种

    java引用传递的类型有哪些

    结果:调用前:50

    调用后:1000

    分析:

    java引用传递的类型有哪些

    理解:好理解

    第二种传递方式

    先看例子

    java引用传递的类型有哪些

    运行结果:

    java引用传递的类型有哪些

    分析图片:

    java引用传递的类型有哪些

    第三种传递方式

    java引用传递的类型有哪些

    结果:

    java引用传递的类型有哪些

    分析:

    java引用传递的类型有哪些

    对于三种引用传递的理解

    第一种和第三种都好理解:

    其实就是C语言那样传递的是地址,当然能够修改属性值,对于第二种其实就是因为String类比较特殊,在第二个例子中fun()函数str2="mldn"其实mldn是个匿名对象!!!这个等式其实就是将str2的引用的地址值改变了,也即使str1的引用地址指向了mldn这个在堆内存的这个对象。

    java引用传值问题

    一图胜万言(配上一张启舰大神的图,一个自定义控件写的很吊的大神):

    java引用传递的类型有哪些

    这几天一直在写一个项目,果然只搞理论是不行的,距离上一次写项目已经快有半年了,今天无论是效率还是熟练度都大不如前

    好了言归正传,今天要说的这个问题其实很简单——在java中的参数传递问题。(其实我承认,这个地方我只是知道对象传引用、普通类型传值,典型的理论派-。+),但是这个问题可大可小,我觉得还是要把这些缕得清清楚楚才好。

    问题起源,一个蠢到家的是失败案例

    其实今天写这篇文章完全是咋呼-。+,恰好是因为自己在做RecyclerView的万能适配器的时候出现的问题,先给大家引入一下当时的场景:

        @Override    public void resultCallbackFromFragment(List<Contact> list) {        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();        ......        contactList = list;        adapter.notifyDataSetChanged();        ......    }

    只留下了我们设计的代码,其他部分的代码全部打&hellip;&hellip;了。接下来我用极其简单的组织语言介绍一下场景:

    打开一个具有复选框的界面,退出时返回选中的数据,方法为一个回调方法,方法的效果是更新列表数据(contactList为我们传入RecyclerView的源数据)。

    理论上说先给contactList更新为获取到的最新的值,然后调用notifyDataSetChanged方法,列表就刷新了,看上去一切都是那么的圆满。然后我们看一下效果:

    java引用传递的类型有哪些

    不要吐槽这个App背景,因为是给我的小仙女做的-。+!

    在上面的效果中,我们看到,在选中了两个联系人,点击确定之后,按道理说应该是显示成两个人,怎么还是刚才的数据呢?

    当时也是知道引用类型的传递传递的是引用,回忆了一下自己当时的思路:引用传递给了另一个引用,这一个引用的内容改变了,所有的都改变了。。。。 (可能有的朋友看到我这句话觉得很好笑:哇博主你好菜啊,这么基础的问题都被绕住了,好吧我得承认Java基础是有些差。。)

    就是这么简单的一句话让我饶了好几个大弯,当时自己已经被绕进去了,觉得这个数据就是被改变了啊,然后就开始从其他地方找错误,过了好久才开始反思:是不是数据传递的过程出现了点问题-。+

    然后自己就开始查找参数传递相关问题,好了,现在开始,我们先跳出上面这个案例中,我不希望大家被上面花里胡哨的东西影响,因为我们今天讲的问题只有一个:java的引用传值。

    两类参数传递

    参数传递主要分为两种:一种是参数是基本类型,一种是参数为引用类型。

    基本数据类型

    这个相信大家都没什么问题,基本类型作为参数传递的时候是在一个方法栈中开辟了一块新内存,拷贝了原来的数据值,所以无论我们如何修改,原来的数据值不会受到任何影响。

    举个简单的栗子:

    public class Practice2 { public static void main(String[] args) {// TODO Auto-generated method stubint a = 5;System.out.println(a);change(a);System.out.println(a);} public static void change(int b) {b = 500;}}

    结果如下:

    5
    5

    没有任何变化,对吧。

    引用数据类型

    首先我们要知道引用的数据存储在栈内存中,而引用指向的对象存储在堆内存中。

    当引用作为方法参数传递给方法的时候,是将引用的值拷贝一份给另一个引用,但引用指向的都是同一个堆内存,所以进行的修改操作同样有效。

    实例代码:

    public class Practice { static A a = new A(10);public static void main(String[] args) {// TODO Auto-generated method stubPractice practice = new Practice();System.out.println(practice.a.intData);change(practice.a);System.out.println(practice.a.intData);} public static void change(A aa) {aa.intData = 500;System.out.println(aa.intData);}} class A{int intData; public A(int intData) {this.intData = intData;}}

    10
    500

    这么说起来没什么难度,对吧。

    引用传递

    其实上面所说的引用形参传递,本质上就是引用的传递,我们将引用传递给了另一个引用,那么这两个引用都有了相同的值&mdash;&mdash;既指向了相同的对象。

    A a1 = new A(10);A a2 = a1;System.out.println("a1的intData: " + a1.intData + "   a2的intData:  " + a2.intData );a2.intData = 500;System.out.println("a1的intData: " + a1.intData + "   a2的intData:  " + a2.intData );

    结果如下:

    a1的intData: 10   a2的intData:  10
    a1的intData: 500   a2的intData:  500

    注意):引用类型中,形参能够改变实参的值,或者一个引用能够改变另一个引用的值,仅仅是因为他们栈内存中存储的值相同,但这个值是随时可以修改的。

    这个也就是本人之前一直被困住的地方,其实只要引用存储的值改变了,这两个引用就毫无关系了。请见下面的例子:

    A a1 = new A();A a2 = a1;System.out.println(a1);System.out.println(a2);a2 = new A();System.out.println(a1);System.out.println(a2);

    结果如下:

    A@33909752
    A@33909752
    A@33909752
    A@55f96302

    在a2指向新的对象后,a1和a2就已经没有任何关系了,因为他们两个引用存储的值已经完全不一样了。

    相信这张图已经说的很明白了吧。

    反过来再解决这个案例

    现在有了上面的理论知识,我们在反过头来看一开始的这个问题。

        @Override    public void resultCallbackFromFragment(List<Contact> list) {        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();        ......        contactList = list;        adapter.notifyDataSetChanged();        ......    }

    在我们获取到了新的list之后,是给contactList赋值了一个新的引用,此时他指向的为一个新的堆内存空间。但是适配器中的list还是指向之前的引用,因为我们只是改变了contactList引用的值,然后执行notifyDataSetChanged方法,可是适配器中list数据还是原来contactList指向的数据。

    因此解决的办法是:直接改变适配器中的list引用,然后调用notifyDataSetChanged方法:

        public void notifyData(List<T> mList){        this.mList = mList;        notifyDataSetChanged();    }

    直接在适配器中写一个修改数据的方法,然后在外面调用就好啦:

        @Override    public void resultCallbackFromFragment(List<Contact> list) {        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();        ......        contactList = list;        adapter.notifyData(contactList);        ......    }

    以上是“java引用传递的类型有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: java引用传递的类型有哪些

    本文链接: https://www.lsjlt.com/news/322673.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • java引用传递的类型有哪些
      小编给大家分享一下java引用传递的类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java引用传递的三种类型第一种结果:调用前:50调用后:1000分析...
      99+
      2023-06-29
    • Javascript中有哪些引用类型传递
      小编给大家分享一下Javascript中有哪些引用类型传递,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JS里面哪些类型是引用类...
      99+
      2022-10-19
    • java中值传递和引用传递有哪些区别
      这篇“java中值传递和引用传递有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java中值传递和引用传递有哪些区别...
      99+
      2023-07-04
    • java 引用传递的三种类型小结
      目录java引用传递的三种类型第一种第二种传递方式第三种传递方式对于三种引用传递的理解java引用传值问题问题起源,一个蠢到家的是失败案例两类参数传递基本数据类型引用数据类型引用传递...
      99+
      2022-11-13
    • java的引用类型有哪些
      java中的引用类型有:1.类,具备某些共同特征的实体的集合;2.接口,一系列方法的声明和方法特征的集合;3.数组,用于在内存块中的连续存储相同数据类型的元素集合;java中的引用类型有以下几种类java中类是指具备某些共同特征的实体的集合...
      99+
      2022-10-13
    • Java中有哪些引用类型
      Java中有哪些引用类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。强引用强引用是最常用的引用类型,如下所示,new Object()会创建一个Object对象并存储在堆...
      99+
      2023-06-14
    • java的参数传递(只有值传递没有引用传递)
      为什么改变引用变量的属性值却可以呢?请看下面的解答。java中的数据类型Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保...
      99+
      2015-05-18
      java教程 java
    • Js值传递和引用传递的不同点有哪些
      本篇内容介绍了“Js值传递和引用传递的不同点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概念不同值传递为单向传递,只能由实参传递给形...
      99+
      2023-06-30
    • JS中值传递和引用传递的区别有哪些
      这篇文章主要介绍了JS中值传递和引用传递的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释...
      99+
      2023-06-14
    • Java和ABAP中的引用类型有哪些
      本篇内容介绍了“Java和ABAP中的引用类型有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java编程语言中几种不同的引用类型是面试...
      99+
      2023-06-02
    • Java中的值传递和引用传递
      Java中的值传递和引用传递 基本概念 值传递: 传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。 引用传递: 传递的并不是实际的对象,而是对...
      99+
      2023-09-15
      java 开发语言 jvm
    • javascript的引用类型有哪些
      javascript中的引用类型有:1.object,对象;2.Array,数组;3.Function,函数;4.Date,日期时间类型;5.RegExp,正则表达式;javascript中的引用类型有以下几种Objectjavascrip...
      99+
      2022-10-06
    • golang的引用类型有哪些
      golang中的引用类型有:1.map,无序的、键值对的集合;2.pointers,计算机内存中变量所在的内存地址;3.slice,数组的抽象;4.channel,指管道,用于实现并行计算方程间通信;5.interface,指接口,一组方法...
      99+
      2022-10-18
    • 详解java的值传递、地址传递、引用传递
      详解java的值传递、地址传递、引用传递一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深。下边总结下以便更容易理解。按照以前的理解,java中基本数据类型是值传递,对象...
      99+
      2023-05-31
      java 值传递 地址传递
    • java 引用类型的数据传递的是内存地址实例
      目录java 引用类型的数据传递的是内存地址看下面的代码和截图list集合存引用数据类型时的问题集合list的存储元素java 引用类型的数据传递的是内存地址 java中引用类型的数...
      99+
      2022-11-12
    • 解析Golang中引用类型是否进行引用传递
      目录引言引用类型引用变量(reference variable)和引用传递(pass-by-reference)Golang是否存在引用变量(reference variable)字...
      99+
      2022-11-11
    • 聊聊java中引用数据类型有哪些
      目录java中引用数据类型有哪些下面说说java中引用数据类型:一、类Class引用二、接口interface引用三、数组引用数组的定义数组的初始化初始化数组的两种方式:为什么Jav...
      99+
      2022-11-12
    • C#中有哪些引用类型
      本篇文章为大家展示了C#中有哪些引用类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#引用类型和值类型的区别——值类型和引用类型在内存中的部署经常听说,并且经常在书上看到:值类型部署在栈上,引用...
      99+
      2023-06-17
    • javaScript引用类型与基本类型有哪些
      这篇文章主要讲解了“javaScript引用类型与基本类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javaScript引用类型与基本类型有哪些”吧!  1. 概念:  基本类型也...
      99+
      2023-06-04
    • Java中参数传递类型的定义
      本篇内容介绍了“Java中参数传递类型的定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先看定义:值传递,是指方法接收的是调用者提供的值...
      99+
      2023-06-17
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作