精华内容
下载资源
问答
  • 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时应该听说过一句“万物皆对象”,《Java编程思想》一书中也描述...还有一个问题就是Java是传递还是引用传递,在C语言中这个问题看到的比较多,在Java中似乎没怎么探讨过。下面围绕上面两个问题来分析!

        刚刚接触Java时应该听说过一句“万物皆对象”,《Java编程思想》一书中也描述对象“将对象视为奇特的变量,它可以存储数据,除此之外,还可以要求它在自身上执行操作。理论上讲,可以抽象待求解问题的任何概念化构件,将其表示为程序中的对象”。对于对象的引用,心里大概知道,却不知怎么表达。还有一个问题就是Java是值传递还是引用传递,在C语言中这个问题看到的比较多,在Java中似乎没怎么探讨过。下面围绕上面两个问题来分析!

     

    *什么是对象引用?

        在C语言中指针是重点亦是难点,到现在还是觉得指针是一个高深的东西,因为它可以直接操作内存,简单地说,指针可以指向一个物理地址,然后操作这一块内存。在Java中的对象的引用和C、C++中的指针是比较像的,不过也只是比较像而已,有人觉得Java中的对象就是一个指针,但事实上,Java中的对象引用和C++中的引用在语法上更加接近,不过两者也存在很大差别。第一版的《Java编程思想》把Java中的对象引用叫做“句柄”,不过我们现在更习惯用“引用”。

         对于Java中的对象引用的解释可以用《Java编程思想》的一段话解释,“每种编程语言都有自己的数据处理方式,有些时候,程序员必须注意将这些要处理的数据是什么类型。你是直接操作元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在Java中得到了简化,一却都被视为对象。因此,我们可以采用一种统一的语法。尽管一切都被视为对象,但操作的标识符实际是指向一个对象的‘引用’ ”。

    再举一个这本书中有关对象个对象引用的例子:

        对象和对象引用就好比电视机和遥控器,对象是电视机,对象引用是遥控器,即遥控器用来控制电视机,遥控器和电视是关联起来的,我们要控制电视,只需要一个遥控器即可。若有String s; ,这里的s创建了一个字符串引用,就相当于有了一个遥控器,可是没有电视机,可是记得吗,还有万能遥控器,,不过在配对之前,万能遥控器是不与任何一台电视机相关联的,当配对成功之后它就与特定的电视机产生了管理,所以说这个s其实现在还是一个还没有指向任何字符串对象的字符串引用,当我们通过new的方式创建了一个字符串对象,其实就相当于给这个引用关联了一个对象,这个引用关联了一个对象,这个引用就指向了这个对象。

     

    弄清楚了Java中的引用,下面补充一段关于String和StringBuffer的例子:

    public static void main(String[] args) {
        String s1 = new String("hello String!");
        String s2 = s1;
        s2 = "你好 String!";
    
        StringBuffer s3 = new StringBuffer("hello");
        StringBuffer s4 = s3;
        s4.append(" StringBuffer!");
    
        System.out.println("s1: "+s1);   //s1: hello String!
        System.out.println("s2: "+s2);   //s2: 你好 String!
        System.out.println("s3: "+s3);   //s3: hello StringBuffer!
        System.out.println("s4: "+s4);   //s4: hello StringBuffer!
    }
    

    之前总结过:String一旦创建就不会再改变,上述代码中,之前s1和s2指向的是同一个对象,但是当是s2重新赋值的话,所指向的对象就变了,这点对于StringBuffer不同,因为它创建的字符串存在缓冲流,所以s3和s4一开始指向的是同一个对象,然后s4改变了这个对象,这个时候其实s3和s4指向的还是同一个对象,所以内容也是相同的。这里记住一个很重要的知识点——

        如果两个引用指向同一个对象,不管哪个引用去改变这个对象,其结果是对象的内容都会发生改变,而且只有一个对象,但是String是一个特例!

     

    *Java中是值传递还是还是引用传递?

        首先,答案是值传递,属于基础知识,却往往被我们忽视。对于Java中的传递方式必须要深刻理解什么是值,什么是引用,刚好上面我们分析了什么是对象的引用。下面还是来看一个例子:

    public static void main(String[] args) {
            String str = "hello";
            setString(str);
            System.out.println(str);  //hello
        }
        public static void setString(String str) {
            str = str + "String";
        }

        在这个例子中,不要被setString()方法中的str迷惑了,这个str和main方法中的str是不一样的,先不谈值传递和引用传递,我们知道String一旦创建是不可变的,所以这里的str是不会变的。实际上是setString()中的这个str指向了新创建的字符串对象“hello String”。

     

        对于Java中的传参我们可以分为基础类型和引用类型,但两者传参方式都是值传递,对于基础数据类型传参方式是值传递是比较好理解的,重点在于引用类型。还是一个例子:

    Integer a = new Integer(1);
    Integer b = a;
    b++ ;
    System.out.println("a="+a+"\t b="+b);  //a=1	 b=2

        这个例子再次说明Java的引用类型是值传递方式传参的,因为a的值没有随着b的改变同时改变。引用类型中的值传递中“值”指的是什么呢?这里的值其实就是引用所存储的对象的地址值,其实b是a的一个复制品,这个b是独立存在的一个引用,在没有将a复制给它的时候,她还是一个空引用,谁也不指向,但是当a复制给它后,就相当于b存储了和a一样的地址,都指向同一个对象,如图1,但是一旦b自增就相当于Integer b = new Integer(2);,就变成了图2,即b引用的地址就变了。

          所以Java中传参的方式只有一种,那就是值传递,另外,我们知道对于引用都是存在栈中的,而实际的对象是存在堆中的,栈中的引用存放了可以指向实际对象的地址,而引用数据类型的传参,传的就是这个地址!

     

    展开全文
  • 1、按值传递对象与传递引用:  通常,编写使用对象作为参数的函数时,应按引用而不是按传递对象。这样做的原因之一是提高效率。按值传递对象涉及到生成临时拷贝,即调用复制构造函数,然后调用析构函数。调用...

     1、按值传递对象与传递引用:

           通常,编写使用对象作为参数的函数时,应按引用而不是按值来传递对象。这样做的原因之一是提高效率。按值传递对象涉及到生成临时拷贝,即调用复制构造函数,然后调用析构函数。调用这些函数需用时间,复制大型对象比传递引用花费的时间要多的多。如果函数不修改对象,应将参数声明为const引用。

            按引用传递对象的另一个原因是,在继承使用虚函数时,被定义为接受基类引用参数的函数可以接受派生类。

     

    虚方法:P471

           设计基类时,必须确定是否将类方法声明为虚拟的。如果希望派生类能够重新定义方法,则应在基类中将方法定义为虚拟的。

    //按引用传递
    void show(const Brass & rba)
    {
        rba.ViewAcct();
        cout<<endl;
    }
    //按值传递
    void inadequate(Brass ba)
    {
        ba.ViewAcct();
        cout<<endl;
    }
    假设将派生类参数传递给上述两个函数:
    BrassPlus buzz("Buzz Parsec",00001111,4300);
    show(buzz);
    inadequate(buzz);
    

            show()函数调用使rba参数成为BrassPlus对象buzz的引用,因此,rba.ViewAcct()被解释为BrassPlus版本。但在inadequate()函数中,ba是Brass(const Brass &)构造函数创建的一个Brass对象,因此,ba.ViewAcct()被解释为Brass版本,所以只有buzz的Brass部分被显示。

             如果希望派生类可以重新定义基类的方法,则可以使用关键字virtual将它声明为虚拟的,这样对于通过指针或引用访问的对象,能够根据对象类型来处理,而不是根据引用或指针的类型来处理。具体地说,基类的析构函数通常应当是虚拟的。

      2、返回对象和返回引用

            返回对象涉及到生成返回对象的临时拷贝,这是调用函数的程序可以使用的拷贝。因此,返回对象的时间成本包括调用复制构造函数来生成拷贝所需的时间和调用析构函数删除拷贝所需的时间。返回引用可以节省时间和内存。

            函数不能返回在函数中创建的临时对象的引用,因为当函数结束时,临时对象将消失,在这种情况下应返回对象,以生成一个调用程序可以使用的拷贝。

        通常的规则是,如果函数返回在函数中创建的临时对象,则不要使用引用。例如,下面的方法使用构造函数创建一个新对象,然后返回该对象的拷贝:
    Vector Vector::operator+(const Vector & b)const
    {
        return Vector(x+b.x,y+b.y);
    }
    
        如果返回的是通过引用或指针来传递给它的对象,则应按照引用传递。例如,下面的代码按引用返回调用函数的对象或作为参数传递给函数的对象:
    const Stock & Stock::topval(const Stock & s)const
    {
        if(s.total_val>total_val)
            return s;
        else
            return *this;
    }
    展开全文
  • js数组和对象分为值传递和引用俩种方式。 对象值传递 let arr={a:1,b:2} let row =Object.assign({}, arr);//row对象之后的操作不会影响到源对象arr 可能有些人对assign不太了解,看一下下面代码就会知道如何使用 ...

    js数组和对象分为值传递和引用俩种方式。

    对象的值传递

    let arr={a:1,b:2}
    let row =Object.assign({}, arr);//row对象之后的操作不会影响到源对象arr
    

    可能有些人对assign不太了解,看一下下面代码就会知道如何使用

    Object.assign(target, ...sources);
    
    1. target 是目标对象
    2. sources 是源对象
    3. 返回值是目标对象
      描述
      如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。
      Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescript

    数组的值传递

    let arr=[{amount:1,content:'1'},{amount:2,content:'2'}]
    let my=[].concat(arr);//my数组之后的操作不会影响到源数组arr
    
    展开全文
  • 传递和引用传递

    千次阅读 2018-09-20 21:35:45
    传递和引用传递的区别: 值传递对象发送改变 不会对引用的内存地址上的源数据产生改变; 引用传递会直接改变源数据。 总结: a.一个方法不能修改一个基本数据的参数 b.一个方法可以可改变一个对象参数的状态(如...
  • php值和对象的值传递和引用传递

    千次阅读 2016-11-28 17:53:44
    这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址…… 查看引用不是什么了解更多信息。 替代的是,引用是符号表别名。注意在PHP 中,变量名变量内容是不一样的, 因此同样的内容可以有...
  • Java对象值传递和对象传递的总结

    千次阅读 2017-03-17 16:41:42
    前两天项目lead面试我,问的第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。 先看基本类型作为参数传递的例子: public class Test1 { public static void main...
  • php数组和对象传递和引用传递

    千次阅读 2012-12-13 16:46:26
    一般的数据类型(int, ...这里详细介绍一下数组的类的对象作为参数进行值传递的区别 数组值传递 实例代码: ?   function main() {  $cc = array(  'a','b'  );
  • 深入理解--Java按传递引用传递

    万次阅读 多人点赞 2017-07-20 15:48:49
    引言最近刷牛客网上的题目时碰到不少有关Java按传递引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路。何乐而不为?Java按...
  • Java传递和引用传递详细说明

    千次阅读 2020-07-14 15:53:17
    学过Java基础的人都知道:传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有传递,...
  •  通常,使用对象作为参数的函数时,应按引用而不是按传递对象,这样可以有效的提高效率。因为按传递的时候,将会涉及到调用拷贝构造函数生成临时的拷贝,然后又调用析构函数,这在大型的对象上要比传递引用...
  • 本文章仅为个人学习总结,如有错误请指正。    首先区分,引用传递和引用类型无关,传递和值类型无关。  建议自己定义一个类,通过类来感受... 引用传递和值传递最大的区别为能否改变所引用的对象,当一个实参传
  • JavaScript的传递和引用传递

    千次阅读 2017-08-09 14:13:42
    JavaScript 传递 引用传递
  • 什么是传递和引用传递

    千次阅读 2017-09-19 15:17:47
    一、什么是传递和引用传递传递,是对于基本数据类型的变量而言的。传递的是该变量的一个副本,改变副本并不影响原变量 引用传递,是对于对象型变量而言的。传递的是该变量地址的一个副本,并不是该对象本身...
  • Java方法传递参数是传递,但是在传递对象引用的时候,引用就是对象实际在堆内存的地址
  • js传递和引用传递问题

    千次阅读 2017-05-22 11:30:37
    复制变量,JavaScript是不允许直接访问内存中的位置,就是说不能直接操作对象的内存空间,所以在操作对象时,实际上是操作对象引用而不是实际的对象。所以引用类型的是按引用访问的。在函数中传递参数.
  • Java 值传递和对象传递详解

    千次阅读 2016-05-12 17:46:04
    堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。传递原理: 一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是对对象引用地址值的拷贝,而非...
  • python传递和引用传递

    千次阅读 2016-08-20 13:59:26
    关于传递和引用传递,综合目前各种的说法,可以得出这样的结论:可变对象为引用传递,不可变对象为传递。但是python中一切事物均视为对象,个人觉得传递对象传递只不过是对象引用的两种表现。如果是可变对象...
  • Java中对象、对象引用、堆、栈、传递以及引用传递的详细解释 1.对象和对象引用的区别: (1).对象: 万物皆对象。对象是类的实例。在Java中new是用来在堆上创建对象用的。一个对象可以被多个引用所指向。 (2...
  • 传递和引用传递的区别

    千次阅读 2014-05-09 16:23:11
    所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。 值传递,例如: class TestT1  {  ...
  • 若说分为传递和引用传递。。引用传递 是因为这个传的地址,导致实参形参 操作的都是同一块内存。 有点乱,像文字层次上的撕逼。。 若往引用传递方面思考,C++的指针又把我搅乱了。,java里不能直接管理...
  • 1.首先,什么是按传递引用传递?按传递就是仅仅把传递过去,相当于传递的是的拷贝,而按引用传递传递的是内存的地址。在 PHP5 中,如果按引用传递,就是将 zval 的地址赋给另一个变量,这时,两个变量都...
  • Java 是传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    最近整理面试题,整理到传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 ...
  • Java中的传递和引用传递

    千次阅读 2013-08-20 11:54:57
    java学习了这么长时间,对于传递和引用传递一直没有一个清晰地概念,最近看到一个文章,算是讲的比较清楚的吧,特意转了过来,已备学习。 (正文) 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象...
  • java中对象作为参数传递给一个方法,到底是传递,还是引用传递? pdd:所谓java只有按传递:基本类型 传递;引用类型,地址传递,所以叫传递。  当主函数的变量,对象(主本)传递到副函数时,传递的...
  • java中对象作为参数传递给一个方法,到底是传递,还是引用传递?  我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 传递!Java中只有按...
  • 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数的改变将会影响实际...
  • Java 中按传递和引用传递的区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 634,013
精华内容 253,605
关键字:

值传递和对象引用传递