精华内容
下载资源
问答
  • 引用大佬的博客: Java:强引用,软引用,弱引用和虚引用 建议直接看大佬的博客,我这里只做总结。 总结 强引用 相当于 Object obj=new Object()这种引用就是强引用,即使OOM也不会被垃圾回收器进行回收 软引用 如果...

    引用大佬的博客: Java:强引用,软引用,弱引用和虚引用

    建议直接看大佬的博客,我这里只做总结。

    总结

    强引用 相当于 Object obj=new Object()这种引用就是强引用,即使OOM也不会被垃圾回收器进行回收
    软引用 如果将要发生了OOM(内存不够用了)则会将对象自动回收
    弱引用 只要发生了gc()就会进行回收虚引用的对象
    虚引用 主要用来跟踪对象被垃圾回收的活动。虚引用必须和引用队列关联使用。

    案例:

    import java.lang.ref.*;
    
    public class WeakReferenceDemo {
    
        public static void main(String[] args) {
            softReferenceTest();// 软引用
            weakReferenceTest();// 弱引用
        }
    
        /**
         * 软引用测试案例
         * 会发现gc后软引用还能获取"hello world!!!",只有将要OOM的gc才会回收对象那么返回null
         */
        private static void softReferenceTest() {
            String helloWorldString = new String("hello world!!!"); // 在堆中根据常量字符串创建一个新的字符串对象
            SoftReference<String> stringSoftReference = new SoftReference<>(helloWorldString);
            System.out.println("打印一下软引用的字符串:" + stringSoftReference.get());//没有进行gc前软引用能得到对象
            /**
             * 置 null 的作用
             * 去除helloWorldString强引用字符串"hello world!!!",
             * 因为对象一旦被强引用指向,即使内存不够,宁愿报错也不会被回收改对象,相当于"hello world!!!"原先由两个引用指向这个对象
             */
            helloWorldString = null;
            System.gc();//进行垃圾回收
            stringSoftReference.get();
            System.out.println("软引用的字符串被垃圾回收了,得到的字符串是:" + stringSoftReference.get());
        }
    
        /**
         * 弱引用测试案例
         * 会发现gc后,弱引用不能获取"hello world!!!"
         */
        private static void weakReferenceTest() {
            String helloWorldString = new String("hello world!!!"); // 在堆中根据常量字符串创建一个新的字符串对象
            WeakReference<String> stringWeakReference = new WeakReference<>(helloWorldString);// 创建一个弱引用,将弱引用指向堆中的那个字符串
    
            /**
             * 置 null 的作用
             * 去除helloWorldString强引用字符串"hello world!!!",
             * 因为对象一旦被强引用指向,即使内存不够,宁愿报错也不会被回收改对象,相当于"hello world!!!"原先由两个引用指向这个对象
             */
            helloWorldString = null;
            System.out.println("打印一下弱引用的字符串:" + stringWeakReference.get());//没有进行gc前软引用能得到对象
            System.gc();//进行垃圾回收
            stringWeakReference.get();
            System.out.println("弱引用的字符串被垃圾回收了,得到的字符串是:" + stringWeakReference.get());
        }
    }
    
    

    再度总结

    之所以要分成这四种引用,就是在gc的时候被引用的对象是否会被回收内存所分成的情况,以及考虑发生OOM的情况进行gc


    强引用: 不用举例子,平时new引用的对象就是强引用
    软引用: 可以通过SoftReference<Obj> sr = new SoftReference<Obj>(obj);进行引用,
    弱引用: 通过WeakReference<String> sr = new WeakReference<String>(new String("hello"));这个例子使用new创建对象为了避免对象在常量池中。
    虚引用: 主要用来跟踪对象被垃圾回收的活动(GCRoot中的引用链应该就是用这个做的,如果一个对象没有被引用GCRoot引用到,则说明这是一个内存垃圾,需要进行垃圾回收)


    虚引用的使用例子:

    ReferenceQueue<String> queue = new ReferenceQueue<String>();
    PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
    
    
    展开全文
  • 引用调用和传值调用

    2017-05-09 15:58:56
    1.传值调用又分为数据传值调用和地址传值调用。 数据传值调用方式是将实参的...2.引用调用是将实参变量值传递给形参, 而形参是实参变量的引用名。引用是给一个已有变量起的别名, 对引用的操作就是对该已有变量的操
    1.传值调用又分为数据传值调用和地址传值调用。
    数据传值调用方式是将实参的数据值传递给形参。
    实参和形参在栈空间内的地址不相同,改变形参值不影响实参值;
    地址传值调用方式是将实参的地址值传递给形参,
    实参和形参在栈空间内共用同一地址,改变形参值就可改变实参值。
    
    
    2.引用调用是将实参变量值传递给形参,
    而形参是实参变量的引用名。引用是给一个已有变量起的别名,
    对引用的操作就是对该已有变量的操作。
    引用调用可以起到地址传值调用的作用,
    即改变形参值就可改变实参值。引用调用比地址传值调用更为简单,
    在C++较多地使用引用调用代替地址传值调用。
    展开全文
  • 引用调用与传值调用

    千次阅读 多人点赞 2017-10-26 12:20:01
    以下关于传值调用与传引用调用的叙述中,正确得是()。 ① 在传值调用方式下,可以实现形参和实参间双向传递数据的效果 ② 在传值调用方式下,实参可以是变量,也可以是常量和表达式 ③ 在引用调用方式下,...

    昨天做到一个题一脸懵逼。

    以下关于传值调用与传引用调用的叙述中,正确得是()。
    ① 在传值调用方式下,可以实现形参和实参间双向传递数据的效果
    ② 在传值调用方式下,实参可以是变量,也可以是常量和表达式
    ③ 在引用调用方式下,可以实现形参和实参间双向传递数据的效果
    ④ 在引用调用方式下,实参可以是变量,也可以是常量和表达式

    答案为 ②③

    所以,要搞懂这个首先要知道形参和实参

    实参与形参

    实参(argument):
    全称为”实际参数”是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

    形参(parameter):
    全称为”形式参数” 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

    形参和实参的区别

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
    实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
    形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
    1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
    2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
    3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
    4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
    5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
    而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。
    所以在函数体内部可以改变实参的值。

    传值与引用

    1. 传值调用又分为数据传值调用和地址传值调用。 数据传值调用方式是将实参的数据值传递给形参。
      实参和形参在栈空间内的地址不相同,改变形参值不影响实参值; 地址传值调用方式是将实参的地址值传递给形参,
      实参和形参在栈空间内共用同一地址,改变形参值就可改变实参值。
    2. 引用调用是将实参变量值传递给形参, 而形参是实参变量的引用名。引用是给一个已有变量起的别名,
      对引用的操作就是对该已有变量的操作。 引用调用可以起到地址传值调用的作用, 即改变形参值就可改变实参值。引用调用比地址传值调用更为简单,
    展开全文
  • C++ 引用作用

    千次阅读 2019-05-08 19:50:32
    学习了参数的三种传递方式:值传递、指针传递与引用传递后不由地对这不熟悉的引用感到好奇,根据引用的概念,引用在定义初始化时与对象名绑定,为对象建立引用名,就类似于别名的作用,可别名不就会像值传递一样不...

    学习了参数的三种传递方式:值传递、指针传递与引用传递后不由地对这不熟悉的引用感到好奇,根据引用的概念,引用在定义初始化时与对象名绑定,为对象建立引用名,就类似于别名的作用,可别名不就会像值传递一样不改变实参的值了吗,可引用传递又能跟指针传递一样改变实参的值,我便抱着这种疑问对引用展开探究。

    先看下引用传递的效果

    #include <iostream>
    
    using namespace std;
    
    void test(int, int&);
    void main() {
        int a = 10;
        int b = 20;
        test(a, b);
        cout << a<< "\012" << b << endl;
    }
    void test(int c,int &d) {
        c = 15;
        d = 25;
    }
    

    在这里插入图片描述

    如果引用只是别名,那他就应该不会占用内存而是跟对象共享内存,反之则更类似于指针,所以先测试引用的内存关系。

    void main() {
        double a ;
        double &b =a;
        double *p =&a;
        double *q =&b;
        cout <<"p:" << p << endl;
        cout <<"q:" << q << endl;
        cout <<sizeof(a) << endl;
        cout <<sizeof(b) << endl;
        cout <<sizeof(p) << endl;  
    }
    

    在这里插入图片描述

    从结果可以看出引用跟对象地址相同,因此大小也相同,即引用不同于指针,引用不会申请内存,那么多个引用应该也是对象的多重别名。

        double a;
        double &b = a;
        double &c = a;
        double &d = a;
        double *p = &a;
        double *q = &b;
        double *r = &c;
        double *s = &d;
        cout << "p:" << p<< endl;
        cout << "q:" << q<< endl;
        cout << "r:" << r<< endl;
        cout << "s:" << s << endl;
    

    在这里插入图片描述

    而间接赋值有三个必要条件:

    1、实参形参。

    2、实参传地址给形参。

    3、形参通过地址间接地去修改实参的值。

    按照引用的规则来看就是通过引用修改实参的值,套入赋值条件则可以理解为实参传地址给形参,形参通过引用的形式接收地址,在修改值时对形参的地址进行间址操作,而这就跟指针的传递相同,而引用初始化时必须赋值与不得修改引用对象的特点可以看出引用同常指针相同。

    void test(int*, int&);
    void main() {
        int a;
        int &b = a;
        test(&a, b);
    }
    void test(int * const c,int &d) {
            *c =15;
            cout<< *c <<endl;
            d =25;
           cout << *c <<endl;
    }
    

    在这里插入图片描述

    可以看作引用在编译过程中以常指针作为实现方式,c++引入可读性与实用性更强的引用,在可以代替指针时应避免使用指针。

    另外引用传递时并非不占内存,查阅资料得知由于其实现方式同常指针,所以引用占用的空间大小与指针相同,而通过sizeof方法得出的只是对象的大小,而这些都是c++为了实用性作出的细节隐藏。

    展开全文
  • c语言传值调用与引用调用

    千次阅读 2018-04-09 15:01:16
    转载自 https://blog.csdn.net/ly0303521/article/details/44310125...2、引用调用 把实参(int a)的地址(&amp;a)赋给形参(指针变量,比如*b,这时b=&amp;a,即b指向变量a),如果*b(也即a对应的内存空间)发生...
  • C语言函数调用三种方式:传值调用,引用调用和传地址调用
  • 右值引用作用

    千次阅读 2019-08-29 21:14:34
    文章目录右值引用Move SemanticsPerfect Forwarding参考 右值引用 自从引入了这个右值引用之后,我们把之前通常叫的引用称为左值引用。 不同 左值引用:我们之前所说的别名 右值引用:大部分时间和左指引用一样,...
  • 传值调用和引用调用的理解

    千次阅读 2019-08-13 22:57:38
    引用调用 实参---->形参(实参传地址给形参,形参获得实参的地址),改变形参会反映在存储单元中,实参会被改变。 只有实参传值或者地址给形参! 没有形参穿值或者地址给实参的说法! 形参没有确定的值,只能是...
  • 文章目录引用引用和指针的区别引用作用常应用 引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名;  int a; int &ra=a;...
  • 形参&实参,传值调用&引用调用

    千次阅读 多人点赞 2019-03-20 09:11:00
    引用调用传值调用传值调用的定义传值调用的代码实例引用调用引用调用的定义引用调用的代码实例 引言 相信很多C语言初学者都知道形参实参的概念,但在函数调用中,仍然还有很多人会混淆,本文将借助示例代码详细解释...
  • 传值调用与引用调用

    千次阅读 2017-07-13 00:46:09
    调用函数和被调用函数之间交换信息的方法有两种: 被调用函数把返回值返回给调用函数 ... 引用调用(Call by reference): 引用是C++中增加的数据类型,当形参为应用类型时,形参名实际上是实参名
  • 传地址调用和传引用调用的区别

    千次阅读 2017-09-05 21:13:17
    传地址调用和传引用调用的区别相同点: 传引用和传地址,原理上都是将参数变量的地址传递给被调函数。所以在函数内部修改参数的值时,均可返回修改之后的结果给调用者。 不同点: 引用一定会指向一个对象,而指针...
  • 除了四类八种基本类型外,所有的类型都称为引用类型(如:数组,类,接口,字符串) 值传递 基本数据类型赋值都属于值传递; 值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形...
  • 引用作用

    千次阅读 2010-05-01 10:32:00
    C++中的引用【导读】介绍C++引用的基本概念,通过详细的应用分析与说明,对引用进行全面、透彻地阐述 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。引用...
  • Java语言中的对象引用分为以下几种:强引用,软引用,弱引用,虚引用 强引用就是平时最常用的引用,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象...
  • 传值引用和调用引用的区别

    千次阅读 2019-06-22 03:34:35
    传值引用一般就是生成一个临时对象,而引用调用是调用参数本身。 参照下面C语言代码理解: 在 test.h文件里实现两个方法  #include <stdio.h> /*交换两个数*/ void exchange(int x,int y){ int ...
  • 引用调用形参

    千次阅读 2016-09-25 15:41:54
    一是传值调用机制,二是用于替换形参的传引用调用机制,下面主要针对传应用调用机制进行简单的阐述。  1. 区别:  传值调用机制是将实参中的值传递给函数的形参,并不会将实参这个变量传入; 传引用调用机制是用...
  • C++中常引用作用

    2016-10-11 10:43:18
    首先回顾一下const常类型的作用:使形参在子函数中调用时成为一个常量来使用,既无法成为左值,无法修改形参的值。 引用&的作用:例如a=&b,那么表示a是b的别名,此时a和b的地址相同。在子函数中调用时,形参的改变...
  • 近期在项目中遇到一个场景,在多层级调用中需要传递上下文,调用过程中上线文对象可能为空,想通过一个公共方法处理上下文,当上下文为空时生成上下文对象,执行相关操作后将该上下文对象向后传递。大致逻辑如下: ...
  • c++中引用作用

    千次阅读 2019-07-06 15:55:50
    引用的基本语法 用途起别名 Type &别名=原名 引用必须初始化 一旦初始化后,不能修改 对数组建立引用 #include<iostream> using namespace std; //1.引用基本语法 ...
  • java基础入门-方法参数的调用是值调用而不是引用调用 package com.ray.object; /** * 方法参数的调用是值调用,而不是引用调用 * * @author ray * @since 2015-04-22 * @version 1.0 * */ public ...
  • 有些程序员,认为java对对象采用的是引用调用,实际上这种理解是不对的!!!       举例代码: 先写一个People类 package diaoYong; class People { private String name; public People(String str...
  • 多态 父类的引用可以调用子类中重写的父类的方法,但不能调用子类中独有的方法,即不能调用父类中不存在,子类中存在的方法。
  • C++传值调用与引用调用的区别

    千次阅读 2014-03-15 23:43:48
    简单来说,传值调用就是指当一个... 引用调用过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被掉函数对形参的任何操作都被处理成间接寻址
  • 函数的传址调用和引用调用

    千次阅读 2014-02-24 15:01:30
    C++中函数的调用有三种:传值调用、传址调用和引用调用,其中引用调用是C语言中没有的。传值调用比较简单,这种调用不能改变形参的值,传址调用和引用调用中形参的改变可以改变实参的值,下面分别予以介绍: (1)...
  • 引用调用和异步调用是 运行到 打开VI引用的时候才把 VI加载到内存, 引用调用的异步调用区别 引用 LabVIEW官方的一句话 如通过子VI节点或通过引用调用节点以标准调用方法调用一个VI,数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,736,022
精华内容 1,494,408
关键字:

引用调用的作用