精华内容
下载资源
问答
  • Java 传递和对象传递详解

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

    1、需要明白的概念:
    堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。

    传递原理:
    一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是对对象引用地址值的拷贝,而非具体值拷贝。下面分析三种情况:

    ①一个方法不能改变传入基本类型的参数值。
    示例代码:

    public class Test2 {
    
        public static void main(String[] args) {
            int a = 1;
            System.out.println("--->>>before a:"+a);
            change(a);
            System.out.println("--->>>after a:"+a);
        }
    
    
        private static void change(int b){
            b = 2;
            System.out.println("--->>>current b:"+b);
        }
    
    }

    打印:

    --->>>before a:1
    --->>>current b:2
    --->>>after a:1

    图解:
    这里写图片描述
    说明:
    b=2单独开了一片空间,和a没有任何关系,所以改变b是不会对a的值有任何影响的。

    ②一个方法不能改变传入对象类型的参数的引用地址。
    示例代码:

    public class Test3 {
    
        public static void main(String[] args) {
            Person pa = new Person("张三");
            System.out.println("--->>>before pa:"+pa.getName());
            change(pa);
            System.out.println("--->>>after pa:"+pa.getName());
        }
    
    
        private static void change(Person pb){
            Person pc = new Person("李四");
            pb = pc;
            System.out.println("--->>>current pc:"+pc.getName());
            System.out.println("--->>>current pb:"+pb.getName());
        }
    
        public static class Person{
            private String name;
    
            public Person(String name){
                this.name = name;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
        }

    打印:

    --->>>before pa:张三
    --->>>current pc:李四
    --->>>current pb:李四
    --->>>after pa:张三

    图解:这里写图片描述

    说明:
    当开始调用change(pa)的时候,实际上是将pa的地址拷贝了一份然后给了pb,所以pa和pb都指向张三;
    pc是从新new的,会重新开辟栈区和堆区的空间;
    然后经过pb = pc的赋值操作后,实际上是让他们同时指向堆区的李四。

    ③一个方法能够改变传入对象类型的参数某一个属性。
    实例代码:

    public class Test4 {
    
        public static void main(String[] args) {
            Person pa = new Person("张三");
            System.out.println("--->>>before pa:"+pa.getName());
            change(pa);
            System.out.println("--->>>after pa:"+pa.getName());
        }
    
    
        private static void change(Person pb){
            pb.setName("李四");
            System.out.println("--->>>current pb:"+pb.getName());
        }
    
        public static class Person{
            private String name;
    
            public Person(String name){
                this.name = name;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
        }
    
    }

    打印:

    --->>>before pa:张三
    --->>>current pb:李四
    --->>>after pa:李四

    图解:
    这里写图片描述
    说明:
    调用change(pa)方法后,实际上是将pa的地址拷贝了一份然后给了pb,所以pa和pb都指向张三;
    调用pb.setName(“李四”)后,实际上是将张三变成了李四,pa和pb引用地址不变,所以pa和pb都指向了李四。

    总结:
    ①一个方法不能改变传入基本类型的参数值。

    ②一个方法不能改变传入对象类型的参数的引用地址。

    ③一个方法能够改变传入对象类型的参数某一个属性。

    展开全文
  • 一: 如何在两个类A和B中传递Value??  (1)方法一:    两个类中都有这个要传递的value成员变量。  均有getValue(),setValue() 函数。    从一个类中getValue(),然后将value通过另一个类的setValue...

     一: 如何在两个类A和B中传递Value??

     (1)方法一:
     
     两个类中都有这个要传递的value成员变量。
     均有getValue(),setValue() 函数。
     
     从一个类中getValue(),然后将value通过另一个类的setValue()
     就可以了 。
     
     
     
    二:  两个类A和B如何共享一个变量value??

     (1)方法一:
     
     将需要共享的变量value放在一个父类中,并且声明为static ,然后类A和类B,分别继承于这个父类。
     
     (C语言中,static 修饰变量的作用: 1.隐藏 2. 持久性 3.默认初始化为0 ,并且只初始化一次)
     
     (2)方法二:
     
     value为全局变量(不推荐)
     或者:
     value为这两个类A,B 范围内的局部变量,但是声明为static.
     或者:
     
     外部管理变量value,并把value的指针传给这两个对象A和B。
     
    三: 两个对象A和B之间的单值传递value:

     (如A向B传递Value)
     
     (1)方法一:
     value为B的成员变量,在A的类中定义一个Value类型的变量,通过B的setValue()来传递value;
     
     百度:C++/java两个类之间如何数据传递
     
    四: 两个类对象A和B,A中有变量n,但是B需要用到A中的n。 如何传递n?


     (1)方法一:
     
      B 要用到A 中的n(也可以是结构体),在B 中定义一个与n同类型的成员变量nDemo, 然后在B中定义一个函数,是以A对象或者A的对象指针

      或者n类型的变量(指针)作为参数,然后获取A中的n,赋值给成员变量nDemo。
      
      然后A如何调用B的这个函数将n传递给B中的nDemo呢?
      
      1.如果为类外传递:
      
      即在A类外传递,则直接在B中的函数的参数是n类型的变量或者变量指针。
      (具体情况,分为按值传递,和引用传递)
      
      2.如果在A类内传递:
     
       在A类中定义B类对象(指针)Btemp作为成员变量,然后通过Btemp调用函数来传递。
      
      
    五:函数参数的按值传递与引用传递:


     (1)按值传递:(不共享数据,仅仅数据传递)
     
     将一个参数传递给一个函数时,函数接收的是原始值的一个副本。
     因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
     
     (2)引用传递:(如共享数据)
     
     将一个参数传递给一个函数时,函数接收的是原始值的内存地址,不是值的副本。
     因此,如果函数修改了该参数指向的内容,调用代码中的原始值也随之改变。


    (3)从A到B中传递 到底是按值传递,还是引用传递 ??


    传递之后,经过B中处理,是否希望A中的实参发生变化?

    如果希望A中实参发生变化,则引用传递,

    否则按值传递。









     
     
     
     
     
     
      

    展开全文
  • 但是字符串作为一个对象传递却意外的是传递。 先定义传递意义:就是讲原先的基本变量或者引用拷贝一份,作为参数传递给函数。特点是当函数里面对该基本变量做修改只对副本起作用,对原先的基本变量或者引用...

    java中对象作为参数传递一般是引用传递,基本变量传值方式是值传递。但是字符串作为一个对象传递却意外的是值传递。

    先定义值传递意义:就是将原先的基本变量或者引用拷贝一份,作为参数传递给函数。特点是当函数里面对该基本变量做修改后只对副本起作用,对原先的基本变量或者引用指向的对象不起作用。
    引用传递的意义:将指向对象的引用变量(地址值)复制一份传递给函数,而不是对象本身,传递的是引用变量的副本。这样一来函数对引用指向的对象的所有改变就是对原先的对象的直接改变。

    下面是一个实验,分别探究对字符串,普通对象,基本变量作为参数传递给函数的到底是值传递还是引用传递。

    package com;
    
    public class Zhi {
        public Zhi(){}
        
    //对应输出字符串没有改变,是值传递。
        static void pass(String a){
            a = "改变字符串的方法生效了";
        }
    
    //对应对象的原先属性改变了,是引用传递。
        static void pass(A a){
            a.age = 100;
        }
    
    //对应基本类型变量的原先值没改变,值传递。
        static void pass(int a){
            a = 222;
        }
    
    //对应原先数组的值没有改变,是值传递。
        static void pass(int[] a){
            a[0]= 99;
        }
        public static void main(String[] args) {
            String first = "原先的字符串";
            String second = new String("原先的字符串");
            A a = new A();
            int bInt = 0 ;
            int[] intArray = {0,1,2,3};
            System.out.println("       最开始字符串量:"+first+
                    "       ---最开始类A的成员变量age值:"+a.age+
                    "        ---最开始整数值:"+bInt+
            "----最开始数组第一个元素值:"+intArray[0]);
    
            Zhi.pass(first);
            Zhi.pass(a);
            Zhi.pass(bInt);
            Zhi.pass(intArray);
            System.out.println("经过方法pass后字符串量:"+first"|”+second+
                    "---经过方法pass后类A的成员变量age值:"+a.age+
                    "---经过pass方法后的整数值:"+bInt
                    +
                    "----经过pass方法后数组第一个元素值:"+intArray[0]);
    
        }
    }
    
    

    输出结果:
    最开始字符串量:原先的字符串|原先的字符串
    —最开始类A的成员变量age值:0
    —最开始整数值:0
    —最开始数组第一个元素值:0
    经过方法pass后字符串量:原先的字符串|原先的字符串
    —经过方法pass后类A的成员变量age值:100
    —经过pass方法后的整数值:0
    ----经过pass方法后数组第一个元素值:99

    总结:在java中一般对象(包括数组)作为参数是引用传递,但是字符串是被当做值传递(划重点);基本类型变量当做值传递。

    对于类似代码块,比如for,while等内部使用外部变量时候,都是直接对外部变量进行修改,此时考虑的是变量作用域的问题,而不是值传递还是引用传递问题。

    展开全文
  • 背景: 做项目的时候,将一个空对象的引用传入到方法中,期待方法里面创建一个新的对象给这个引用,后面就可以拿着这个对象用了。  可结果就是,定义在外面的对象引用并没有拿到这个引用 demo.java ...

    背景: 做项目的时候,将一个空对象的引用传入到方法中,期待方法里面创建一个新的对象给这个引用,后面就可以拿着这个对象用了。

       可结果就是,定义在外面的对象引用并没有拿到这个引用


    demo.java


    public class Entry
    {
        public static void main(String[] args)
        {
            List<String> re = new ArrayList<>();
    
    
    	// initial 一个对象,期望这个对象经过函数能引用到新的对象
            TestObject test=new TestObject("1","2");
            addObject(test);
            System.out.println(test.hashCode());
    
        }
    
    
        // 希望这个函数能将test引用到新的对象
        public static void addObject(TestObject object)
        {
              System.out.println(object.hashCode());
                object = new TestObject("2", "4");
            System.out.println(object.hashCode());
    
            object.setId("100");
        }
    }
    
    
    执行结果如下:
    1259475182
    1300109446
    1259475182
    
    
    
    可以看到进入到函数里面之后,test这个引用变成了局部变量,不会影响到全局变量test,一旦出了函数还是test,并没有引用到新的对象。
    
    
    进入到函数之后test引用到新对象没问题,出去之后test还是老得对象,但是java不是传递对象引用关系么;实际都是值传递,对象看着像
    引用传递,实际传的是对象的地址,像c++一样,对地址修改影响到原来值;如果对传入函数的对象引用参数赋值,那么也是把一个对象的引用
    赋值给了一个地址变量,在java中,变量传入到函数参数是变量的一份拷贝,并不会影响到原来的值的。
    
    
    经常使用的是把对象传入到一个function,对这个对象内容修改,修改引用这个基本没有用过,

    展开全文
  • @TOC let {...data} = this.listQuery;
  • java中的参数传递-值传递、引用传递

    千次阅读 2017-04-12 16:38:05
    参数是按而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。 在 Java 应用程序中永远不会... Java 应用程序是按值传递对象引用的。   Java 应用程序中的变量可以为以下两种类型之
  • 一.背景 一天写代码出了bug,Activity传给fragment的arraylist经过fragment中的修改居然会改变activity的arrayList...一开始找到这篇博客:http://www.cnblogs.com/duanxz/p/3566221.html  里面说bundle是传递引用,但
  • Java中是引用传递还是值传递

    千次阅读 多人点赞 2016-10-23 00:01:41
    - **值传递:**将方法实际参数复制到另一个变量,然后复制的对象传递,这就是为什么它被称为“值传递”- **引用传递:**将实际参数的引用传递给该方法,这就是为什么它被引用称为“传递”的原因。 例子分析1问题:...
  • Python参数传递 - 引用传递&值传递

    万次阅读 2016-05-25 09:51:42
    Python值传递和引用传递区别,哪些类型值传递,哪些是引用传递值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数的改变不影响实际参数的。>>> a1 = 520 >>> a2 = a1 >>> print ...
  • python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple.最近看到这些知识下面来整理一下... python不可变对象int,string,float,tuple先来看一个例子 def int_test(): i = 77...
  • 在Python中,如果将数字、字符串等传入到函数中,再改变其,我们会发现:当函数结束时,该变量不会发生改变。 In [20]: def q(x): ...: x = 2 ...: In [21]: a = 1 In [22]: q(a) In [23]: a Out[23]: 1 ...
  • 当一个对象被当作参数传递到一个方法,此方法可改变这个对象的属性,并可返回变化的结果,那么这里到底是值传递还是引用传递?
  • Java的类型、对象以及值传递,常常是众多面试官喜欢混淆的概念之一。自以为有清晰了解的童鞋们,也常常在面试官的妖言之下就迷失方向,而笔者就是其中一个。为此,笔者翻看了The Java Language Specification ...
  • Java面试题:当一个对象被当做参数传递到一个方法,此方法可改变这个对象的属性,并可返回变化的结果,那么这里到底是值传递还是引用传递?? 答:是值传递。Java编程语言中只有由值传递参数的。当一个对象实例...
  • java引用传递值传递的详细探讨

    万次阅读 多人点赞 2015-12-09 18:22:47
    问题来源于一道广泛的面试题:当一个对象被当作参数传递到一个方法,此方法可改变这个对象的属性,并可返回变化的结果,那么这里到底是值传递还是引用传递? 为了解决这个问题,查阅了各种资料,却发现没有统一...
  • 传值意味着传的是副本,不会改变被传递...2、Java 应用程序有且仅有的一种参数传递机制,即按值传递,如果对象被当作参数传递,外部对象(实参)不变,函数内容的对象(实参)会变 以代码下来证明3,4,哪一个是正确
  • java 值传递及地址传递(引用传递

    千次阅读 2014-09-21 19:17:05
    一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完感受颇深。下边总结下以便更容易理解。  按照以前的理解,java中基本数据类型是值传递对象是...
  • 有人说java 参数传递在对primitive类型的参数传递时候是值传递,对对象参数的传递是引用传递。 可是JAVA规范里面却说的是总是值传递。 看看这个图就理解了。 对传入的参数总是有个copy的过程。因为primitive类型...
  • 问:当一个对象被当做参数传递到一个方法,此方法可改变这个对象的属性,并返回变化的结果,那么这里到底是值传递还是引用传递? 答:是值传递。在java语言中只有值传递参数;当一个对象实例作为一个参数被...
  • 首先我们写出一段程序,这段程序用来介绍两种传递方式的区别。include using namespace std; void swap1(int a,int b); void swap2(int* a,int *b); void swap3(int& a,int& b); int main() { int a=2,b=3; swap1...
  • 学过其它语言如(C,C++),都知道参数传递值传递和引用传递,python的参数传递属于哪种? 一、值传递和引用传递 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟...
  • C# 按值传递,按引用传递

    千次阅读 2018-08-03 16:02:31
    值按值传递,引用类型按值传递的实质的是传递值,参数为值类型时,“值”为实例本身,因此传递的是实例拷贝,不会对原来的实例产生影响;参数为引用类型时,“值”为对象引用,因此传递的是引用地址拷贝,会改变原来...
  • 参数传递的一些知识,不全面部分望... 不改变,即操作的是一个的拷贝,所以原值不变。 call by reference 改变,但是不改变实际参数的参考地址。可以理解为将另一个引用也指向同一个对象。 代码: publ
  • 如果某个对象在被创建其状态就不能被修改,那么这个对象就被成为不可变对象。线程安全型是不可变对象的固有属性之一,他们的不变性条件是由构造函数创建的,只要他们的状态不改变,那么这些不变性条件就
  • C++如何向函数传递对象

    千次阅读 2015-01-03 16:17:50
    函数中如果对对象进行了修改,对象值不变;相当于创建对象的一个副本传递给函数 #include using namespace std; class Test { public:  Test(int a){num=a;}  ~Test(){}  void setNum(int a){num=a;} ...
  • java 引用传递,还是值传递 之坑

    千次阅读 2016-03-30 22:21:16
    对非原生类型,即对象类型值传递的 坑,工作中遇到的实际问题,记录下来,以备回忆和参考,说的不准确的地方务请大神留言, 注,此处对传递的是String的情况暂不讨论,这个相对比较特殊,网上也有文章另作分析 ...
  • [code="java"]Map map = new HashMap(); Map params = new HashMap(); map.put("params", params);...该对象更新,Map里面被put的引用随着改变。 对于String,我用代...
  • 值传递和引用传递分析 Java中数据类型分为两大类:基本类型和引用类型(也就是对象类型)。 基本类型:boolean、char、byte、short、int、long、float、double 引用类型:类、接口、数组 因此,变量类型也可分为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,551
精华内容 44,220
关键字:

对象传递后值不变