精华内容
下载资源
问答
  • JAVA值引用和地址引用

    2020-12-21 16:31:10
    值引用与地址引用异同: 在Java方法中参数列表有两种类型的参数,基本类型和引用类型。 基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变...

    看这道题目,输出结果是0

    值引用与地址引用异同:

    在Java方法中参数列表有两种类型的参数,基本类型和引用类型。

    基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。

    引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象会被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)。

    这两种类型都是将外面的参数变量拷贝一份到局部变量中,基本类型为值拷贝,引用类型就是将引用地址拷贝一份。

    像引用数据类型的我们可以直接传递他的实例对象到方法中改变他的值 不用返回,这个实例对象的值也会变,包装类型和基本数据类型不行。

    回到该题目:

    该题目传递的是包装类Integer,属于引用数据类型,那么为什么最后地址引用改变了,但是值却没变呢?

    因为包装类有一个特殊的操作存在,就是拆箱和装箱

    所以以后遇到包装类的问题,就可以当成基本数据类型的值传递来解决就行了。

    换句话说包装类是引用类型   但是每次重新赋值都相当于赋给了一个新的对象,  所以看起来像是值传递

    综上所述:该问题的输出为0,就毫无问题了。

    展开全文
  • 在优化代码的时候发现一个问题 ListA使用addAll 方法得到了ListB的 但是我在修改ListA集合中某一个元素的时 发现原集合ListB的也跟着改变了 ;  该图片当时搞得我很懵,我刚开始只知道 ListA=ListB 的时候...

     

    在优化代码的时候发现一个问题  ListA使用addAll 方法得到了ListB的值  但是我在修改ListA集合中某一个元素的值时 发现原集合ListB的值也跟着改变了 ; 

    日志

    该图片当时搞得我很懵,我刚开始只知道 ListA=ListB 的时候 改变ListA 的值 ListB的值也会跟着改 那为什么addAll方法也会造成这样的结果呢 直接百度  查!

    集合中关于addAll的一些问题

    通过查找 这个值类型和引用类型 引起了我的注意  继续查

    java中ArrayList的addAll方法添加引用类型对象时值会修改 

    list的addAll方法是浅拷贝

    之后又引出了一个新的概念  什么是浅拷贝 查~~~~~~

    List 复制之 浅拷贝与深拷贝

    才弄懂了我之前的问题产生的原因

    当集合List使用引用类型的时候  举个例子 

    日志文件

    引用类型就是这个MuliiInfo这个对象  

    改变List.get(0).getRealName的值 是会改变这个ReFreshBean的值

    原因在于 你的ReFreshBean对象在初始化的时候开开辟的内存地址是 0x00000(打个比方)List在赋值的时候 引用的是ReFreshBean这个对象   他们引用的对象的值是一样的  指向了同一个内存地址

    所以不管你修改集合List.get(0).getRealName的值  还是ReFreshBean的值  2个都会变为最后修改的值

    但是当集合使用值类型的时候 改变集合的值 是不会改变这个引用类型的值的 再举个值的例子

    打印值日志

    用基本类型值传递的时候 你修改值 集合是不会变的 

    理解了这个基础的问题  看来我的基础不是很牢啊  下面来最终解决 addAll的问题

    java List深拷贝的两种方式

    下面这个方法 放在工具类中
     /***
         * 方法一对集合进行深拷贝 注意需要对泛型类进行序列化(实现Serializable)
         *
         * @param srcList
         * @param <T>
         * @return
         */
        public static <T> List<T> depCopy(List<T> srcList) {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            try {
                ObjectOutputStream out = new ObjectOutputStream(byteOut);
                out.writeObject(srcList);
    
                ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
                ObjectInputStream inStream = new ObjectInputStream(byteIn);
                List<T> destList = (List<T>) inStream.readObject();
                return destList;
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }

    之后使用方法 

    就可以代替addAll方法了 

    展开全文
  • java中的参数传递(只有传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的是不会改变原变量的的,但为什么改变引用变量的属性却可以呢?请看下面的解答。 java中的数据类型 Java中...

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。

    java中的数据类型

    Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存的值是引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress。

    引用类型包括:类、接口类型和数组。

    java中只有值传递

    在日常编码中,会经常看到如下现象:

    1、对于基本类型参数,在方法体内对参数进行重新赋值,不会改变原有变量的值。

    2、对于引用类型参数,在方法体内对参数进行重新赋予引用,不会改变原有变量所持有的引用。

    3、方法体内对参数进行运算,不会改变原有变量的值。

    4、对于引用类型参数,方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。

    举个例子:

    public class Main {
    
        private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){
    
            b = true;
    
            boo = new Boolean(true);
    
            arr[0] = true;
    
        }
    
           //测试
    
        public static void main(String[] args) {
    
            boolean b = false;
    
            Boolean boo = new Boolean(false);
    
            Boolean[] arr = new Boolean[]{false};
    
            getMiddleOne(b, boo, arr);
    
            System.out.println(b);
    
            System.out.println(boo.toString());
    
            System.out.println(arr[0]);
    
            /**
    
            * output:
    
            * false
    
            * false
    
            * true
    
            */
    
        }
    
    }

    我们只要了解了下面两点就可以解答上面的现象了:

    1、基本数据类型的值就是数值本身,所以示例中的b的值就是false;包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;数组是引用类型,所以arr的值就是指向该Boolean[]的引用。

    2、java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。

    通过上面两点就可以清楚了,getMiddleOne方法中执行的 b=true 和 boo = new Boolean(true) 都是把新值赋给了他们的拷贝,所以不改变原变量的值;同样,arr[0] = true 是把true复制给了arr的拷贝所指向的数组的第一个元素,arr的值和arr的拷贝的值都是该数组的引用,所以arr的拷贝所指向的数组和arr所指向的数组是同一个,所以改变arr的拷贝的数组的元素会同样影响到原变量arr。

    总结

    java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。

     

    展开全文
  • JAVA对象引用和值引用

    2014-07-01 09:19:14
    以前就知道JAVA对象分对象引用和值引用,并且还知道8种基础数据类型,即引用时是值引用的数据类型,比如int,short,long,byte,float,double,char,boolean,其它都是对象引用。可是其它的对象引用我一直都以为跟c里面...
  • Java 传递 引用传递

    2011-10-27 13:55:46
    Java 传递 引用传递   Java中除了八大基本数据类型以及相对应的封装类和String类型,是传递已外,其他都是引用传递。
  • Java值传递和引用传递详细说明

    千次阅读 2020-07-14 15:53:17
    学过Java基础的人都知道:传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有传递,...
  • 今天看thinking in java看到传递时候 猛然间想起刚工作时候面试被问到传递还是引用传递 网上找了找才知道java只有传递 基本类型传递的是 引用类型是传递的引用本身
  • java 类型和引用类型

    千次阅读 2017-09-11 16:34:21
    java 中的数据类型分为两大类:类型(基本数据类型)和引用类型(复合数据类型) 一,类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3,布尔类型(boolean) 4,字符类型(char) 二,引用...
  • java值传递与引用传递

    2016-09-01 11:24:49
    java到底是传递还是引用传递呢,这是在面试中经常被问到的问题。也有可能用java好久了好搞不清楚java参数传递到底是怎么传的,是还是引用,或什么时候是传递什么时候是引用传递,下面就带大家看一下,java传递...
  • Java——值引用和对象引用

    千次阅读 2019-09-12 11:47:49
    如果你答对了,也不要高兴,你可能只是感觉上对了,我之前一直以为对象引用和C语言中的指针是一回事,其实不是,他是引用的复制,接下来我们看看他在内存中是怎么存储的吧: 总之你可以这么理解: = 抽象上来...
  • Java值传递和引用传递

    2015-03-12 14:38:38
    对于java中的传递和引用传递一直颇受争论,《Core Java》的作者,以及JAVA的创造者James Gosling都认为当一个对象或引用类型变量被当作参数传递时,也是传递,这个就是对象的引用,因此JAVA中只有传递,没有...
  • Java 传递与引用传递

    千次阅读 2011-05-08 13:05:00
    Java 传递与引用传递
  • 传递和引用传递8种基本数据类型,和其扩展的引用类型,都是传递,也就是说是将拷贝了一份,传递下去。除了8种基本类型和其扩展的类型之外,都是引用传递,即...java中没有被任何引用所指向的对象是垃圾,会被垃
  • C#和Java中对象分为类型和引用类型,不同类型的对象存储方式不同,如果想要深入了解程序首先要分清楚:哪些是类型?哪些是引用类?
  • Java值传递与引用传递

    2015-07-04 18:36:52
    1 Java值传递 Java原始数据类型在传递时以值传递,而包装类和其他的类在传递时是按引用传递的。 s1按照引用传递,n按照值传递,所以passParam(s1, n) 函数会修改s1的内容,而n的值不变。 将n的类型改...
  • Java值引用和对象

    2017-12-01 10:10:21
    每种编程语言都有自己操作内存中元素的方式,有时候,程序员必须注意将要处理的数据是什么类型,是直接操纵元素,还是通过某种间接的表示来操纵对象。本文简单介绍Java中如何分配内存,类型和对象的存储逻辑。
  • Java传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    最近整理面试题,整理到传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 ...
  • java值传递与引用传递的区别
  • 一 为什么 Java 中只有传递? 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按调用(call by value)表示方法接收的是调用者提供的,而按引用调用(call by reference)表示方法...
  • JAVA值传递和引用传递

    2018-03-14 18:20:43
    1:按传递是什么指的是在方法调用时,传递的参数是按的拷贝传递。...示例如下:3:按引用传递的重要特点传递的是引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。示例如下:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,039
精华内容 10,415
关键字:

java值引用

java 订阅