精华内容
下载资源
问答
  • java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递;引用类型,地址值传递,所以叫值传递。  当主函数的变量,对象(主本)传递到副函数时,传递的...

    看完绝对清晰~

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?

    pdd:所谓java只有按值传递:基本类型  值传递;引用类型,地址值传递,所以叫值传递。

        当主函数的变量,对象(主本)传递到副函数时,传递的变量、对象(方法中的形参)其实都是副本,而副本的改变不会影响主  本。

    基本类型:传递的是值的拷贝,也就是说传递后就互不相关了,也就是说,不过副函数的副本如何变化,主本永远不会被影响。

    引用类型:传递的是引用地址值,有可能会被影响。

    string:具有不可变。是特殊的引用类型,其作用跟基本类型一样,传递后不相关。

     

    原作者:

    String和int参数传递是按值传递还是引用传递?

    一道面试题目,String的传递:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    public String change(String s){

         s = "222";

         return s; 

    }

    public static void main(Stirng[] args){

        String s = "111"

        change(s);

        sout(s);

    }

    我看到题目愣了一下,本来不假思考的结果是111,但仔细想,String是对象类型的,对象传递的是地址,那么地址传递到方法里面后,将指向修改成222,那么结果应该是222才对。实际恰恰相反。

    Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。 

    java传递参数都是值,如果是对象的话,就是将引用的值复制一份给方法当参数。如果是根据引用把堆里的对象修改了,那么对象真被修改了,不过不是被创建赋值给的那个引用修改的,是方法里的一个复制的引用副本给修改的。换句话说,施瓦星格的媳被施瓦星格的克隆人亲了下。

    用实例去理解,其实这个理解也就是根据jdk的结果告诉我自己记住规则是这样的,以后要记住。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

      public String change(String s, int i, StringBuffer sb, Person p){

            s="123";

            i=3;

            sb.append("woshi");

            p.setAge(100);

            sb = new StringBuffer("sbsb");

            p = new Person("bb",44);

            return s;

        }

     

        @Test

        public void testChange(){

            StringBuffer sb = new StringBuffer("buff");

            String s = "aaa";

            int i = 1;

            Person p = new Person("aa",12);

            i=2;

            change(s,i,sb,p);

    //        s="222";

            System.out.println(s);

            System.out.println(i);

            System.out.println(sb.toString());

            System.out.println(p);

        }

    这里一共测试了String,int,一个对象StringBuffer,一个对象people。让我们来仔细看看这些传递都发生了什么。我想有很大一部分人都猜不出打印结果。

    1

    2

    3

    4

    aaa

    2

    buffwoshi

    Person{id=0, name='aa', age=100, Country=null, hashcode=638783031}

    我们来一个个分析。

    首先是String。

    1

    String s = "aaa";

    这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。

    然后就到了change方法里。这里这样理解:将s引用的一个拷贝传给方法change。这样change有一个变量s,这个s也是指向aaa的。那么我们来通过debug来看后来发生了什么。

    1.s指向aaa的时候:

    2.s运行到change方法里的时候

    然后看s再次赋值的时候:

    然后我们运行结束change方法后到主方法里:

    到这里s就结束了。那么如果我们按照传递的是s这个变量的引用,即String s="aaa"中这个s本身,那么,s这个本身是个变量,s指向aaa,在方法change里s又指向了123,回到主方法后s变量的指向被改变了?错!显然s仍旧是aaa,那么只能这样理解:s传递到方法里的时候,复制了s指向的地址给change,change里的s是另一个s,s指向aaa(@718),然后在change中s又指向了123(@731),由于String是不可变类(final and Immutable),这里只是把副本s的指向修改成731,原地址718里的对象没有发生改变因为String不可变。那么,回到主方法的时候,s变量本身没有任何改变,s仍旧指向地址718,718的内容是aaa。所以最终打印aaa。

    然后是StringBuffer

    int是基本类型,所以int只是将值复制一份给别的方法用,这个大家都知道,就不去测试了。现在看StringBuffer发生的改变。

    1.初始化:

    2.到change方法中:

    3.发生append

    4.指向新对象

    这里就要说一下了,副本指向了新对象。就好比,施瓦星格的克隆人找了另一个女的当老婆,而真正的施瓦星格老婆没有变。

    5.回到主方法:

     

    到这里,StringBuffer就结束了。我们必须知道,虽然我们没有去研究源码是怎样实现的,change方法得到是一个sb的副本,只不过这个副本指向708,在change里对708的对象追加,708的对象就真的改变了。然后又把sb副本指向新地址737。这只是把副本指向的地址修改了,如果你在这里打印sb.toString(),打印的就是737里的内容。当跳出change,回到主方法的时候,原sb仍旧还是指向708的,最终就是打印708的结果。和String不同的是,StringBuffer的结果发生了变量,因为StringBuffer是可变的,可以append。而String是不可变的,在change中s=123就是发生两个行为,一个是查找常量池中是否有123,如果没有就在堆中创建123,一个是将s指向123.也就是说这时候是创建了一个新的String对象,而不是把原来的String对象s内容修改。这样,回到主方法的时候,s仍旧是aaa。

    同理,看自己创建的对象people

     

    1.初始化:

    2.p传递到change里的时候

    3.p副本设置age

    4.p副本重新赋值

     这里仍旧要说一下,p副本修改了自己指向,并不影响主方法里的p的指向。主方法里的p的指向没有发生变化,依旧应该还是720.

    5.回到主方法

    总结:

    通过上面对String,StringBuffer,People的研究,应该明白一个道理,重要的话说三遍,重要的规则我都演示了三遍。如果跟着步骤一步步走的,肯定牢记住了:

    java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!

    这里必须记住的就是副本概念。在方法里,运行的时候到这里的线程都会把传过来的参数拷贝副本带自己的工作区中,在工作区中对这个副本的值发生一些改变。最终改变的是副本,如果通过副本的指向修改了指向中的内容,那么那个指向的地址里的内容确实改变了。如果修改了副本的指向,即给副本重新赋值,那么关原来的变量何事?元变量仍旧指向最初的地址。

    那么,String传递过去的是副本,修改了副本的指向,打印元string是不会改变的,因为副本没有能力修改final的String类。

     

    出处:http://blog.csdn.net/zzp_403184692/article/details/8184751

    展开全文
  • java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递;引用类型,地址值传递,所以叫值传递。 当主函数的变量,对象(主本)传递到副函数时,传递的...

    参考链接: 用Java传递和返回对象

    看完绝对清晰~ 

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 

    pdd:所谓java只有按值传递:基本类型  值传递;引用类型,地址值传递,所以叫值传递。 

        当主函数的变量,对象(主本)传递到副函数时,传递的变量、对象(方法中的形参)其实都是副本,而副本的改变不会影响主  本。 

    基本类型:传递的是值的拷贝,也就是说传递后就互不相关了,也就是说,不过副函数的副本如何变化,主本永远不会被影响。 

    引用类型:传递的是引用地址值,有可能会被影响。 

    string:具有不可变。是特殊的引用类型,其作用跟基本类型一样,传递后不相关。 

      

    原作者: 

    String和int参数传递是按值传递还是引用传递? 

    一道面试题目,String的传递: 

     1 2 3 4 5 6 7 8 9  public String change(String s){      s = "222";      return s;  } public static void main(Stirng[] args){     String s = "111";      change(s);     sout(s); } 

    我看到题目愣了一下,本来不假思考的结果是111,但仔细想,String是对象类型的,对象传递的是地址,那么地址传递到方法里面后,将指向修改成222,那么结果应该是222才对。实际恰恰相反。 

     

     Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。  

     

    java传递参数都是值,如果是对象的话,就是将引用的值复制一份给方法当参数。如果是根据引用把堆里的对象修改了,那么对象真被修改了,不过不是被创建赋值给的那个引用修改的,是方法里的一个复制的引用副本给修改的。换句话说,施瓦星格的媳被施瓦星格的克隆人亲了下。 

    用实例去理解,其实这个理解也就是根据jdk的结果告诉我自己记住规则是这样的,以后要记住。 

     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24    public String change(String s, int i, StringBuffer sb, Person p){         s="123";         i=3;         sb.append("woshi");         p.setAge(100);         sb = new StringBuffer("sbsb");         p = new Person("bb",44);         return s;     }       @Test     public void testChange(){         StringBuffer sb = new StringBuffer("buff");         String s = "aaa";         int i = 1;         Person p = new Person("aa",12);         i=2;         change(s,i,sb,p); //        s="222";         System.out.println(s);         System.out.println(i);         System.out.println(sb.toString());         System.out.println(p);     } 

    这里一共测试了String,int,一个对象StringBuffer,一个对象people。让我们来仔细看看这些传递都发生了什么。我想有很大一部分人都猜不出打印结果。 

     1 2 3 4  aaa 2 buffwoshi Person{id=0, name='aa', age=100, Country=null, hashcode=638783031} 

    我们来一个个分析。 

     首先是String。 

     1  String s = "aaa"; 

    这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。 

    然后就到了change方法里。这里这样理解:将s引用的一个拷贝传给方法change。这样change有一个变量s,这个s也是指向aaa的。那么我们来通过debug来看后来发生了什么。 

    1.s指向aaa的时候: 

     

    2.s运行到change方法里的时候 

     

    然后看s再次赋值的时候: 

     

    然后我们运行结束change方法后到主方法里: 

     

    到这里s就结束了。那么如果我们按照传递的是s这个变量的引用,即String s="aaa"中这个s本身,那么,s这个本身是个变量,s指向aaa,在方法change里s又指向了123,回到主方法后s变量的指向被改变了?错!显然s仍旧是aaa,那么只能这样理解:s传递到方法里的时候,复制了s指向的地址给change,change里的s是另一个s,s指向aaa(@718),然后在change中s又指向了123(@731),由于String是不可变类(final and Immutable),这里只是把副本s的指向修改成731,原地址718里的对象没有发生改变因为String不可变。那么,回到主方法的时候,s变量本身没有任何改变,s仍旧指向地址718,718的内容是aaa。所以最终打印aaa。 

     然后是StringBuffer 

    int是基本类型,所以int只是将值复制一份给别的方法用,这个大家都知道,就不去测试了。现在看StringBuffer发生的改变。 

    1.初始化: 

     

    2.到change方法中: 

     

    3.发生append 

     

    4.指向新对象 

     

    这里就要说一下了,副本指向了新对象。就好比,施瓦星格的克隆人找了另一个女的当老婆,而真正的施瓦星格老婆没有变。 

    5.回到主方法: 

     

      

    到这里,StringBuffer就结束了。我们必须知道,虽然我们没有去研究源码是怎样实现的,change方法得到是一个sb的副本,只不过这个副本指向708,在change里对708的对象追加,708的对象就真的改变了。然后又把sb副本指向新地址737。这只是把副本指向的地址修改了,如果你在这里打印sb.toString(),打印的就是737里的内容。当跳出change,回到主方法的时候,原sb仍旧还是指向708的,最终就是打印708的结果。和String不同的是,StringBuffer的结果发生了变量,因为StringBuffer是可变的,可以append。而String是不可变的,在change中s=123就是发生两个行为,一个是查找常量池中是否有123,如果没有就在堆中创建123,一个是将s指向123.也就是说这时候是创建了一个新的String对象,而不是把原来的String对象s内容修改。这样,回到主方法的时候,s仍旧是aaa。 

     同理,看自己创建的对象people 

     

      

    1.初始化: 

     

    2.p传递到change里的时候 

     

    3.p副本设置age 

     

    4.p副本重新赋值 

     

     这里仍旧要说一下,p副本修改了自己指向,并不影响主方法里的p的指向。主方法里的p的指向没有发生变化,依旧应该还是720. 

    5.回到主方法 

     

     总结: 

    通过上面对String,StringBuffer,People的研究,应该明白一个道理,重要的话说三遍,重要的规则我都演示了三遍。如果跟着步骤一步步走的,肯定牢记住了: 

     

     java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本! 

     

    这里必须记住的就是副本概念。在方法里,运行的时候到这里的线程都会把传过来的参数拷贝副本带自己的工作区中,在工作区中对这个副本的值发生一些改变。最终改变的是副本,如果通过副本的指向修改了指向中的内容,那么那个指向的地址里的内容确实改变了。如果修改了副本的指向,即给副本重新赋值,那么关原来的变量何事?元变量仍旧指向最初的地址。 

    那么,String传递过去的是副本,修改了副本的指向,打印元string是不会改变的,因为副本没有能力修改final的String类。 

      

    出处:http://blog.csdn.net/zzp_403184692/article/details/8184751

    展开全文
  • 1、Java语言的方法调用只支持参数的值传递,java所有的参数传递都是传递的副本,变量所代表的值的副本,如果通过副本的指向修改了指向中的内容,那么那个指向的地址里的内容确实改变了。如果修改了副本的指向,即...

    1、Java语言的方法调用只支持参数的值传递,java所有的参数传递都是传递的副本,变量所代表的值的副本,如果通过副本的指向修改了指向中的内容,那么那个指向的地址里的内容确实改变了。如果修改了副本的指向,即给副本重新赋值,那就和原来的变量无关。

    698d4d1384143448d25cb377398bc1ec.png

    2、基本类型传递的是值的拷贝,传递后互不相关。

    引用类型传递的是引用地址值,可能被影响

    由于String被final定义所以不可变, 是特殊的引用类型,作用和基本类型一样,传递后不相关,打印原string是不会改变的。

    f20836b8247ece0dbb07e32fce6be2b8.png

    3、值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

    引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将会影响到实际参数。

    386e81577fd4510aba975f83be494d36.png

    4、举一个形象的例子。再来深入理解一下值传递和引用传递

    你有一把钥匙,当别人想来你家时,如果你直接把你的钥匙给他了,这就是引用传递。这样,如果他弄折了这把钥匙,那么他交给你的时候,这把钥匙就折了。

    你有一把钥匙,当别人想来你家时,如果你复制了一把给他,自己的还在自己手里,这就是值传递,这样他还给你的时候,不会对你自己的钥匙造成影响。

    但是,不管是什么情况,别人拿着钥匙在你家画上自己的名字,那肯定会有影响,也就是我们在方法中修改了对象的属性值。

    5、核心技术卷一 119-121【4.5】

    展开全文
  • 由于您具有在Plant类中定义的averageLeaves(),因此您必须实际从其中一个工厂实例调用方法.这是你应该怎么做的.plantA.averageLeaves();你在这里犯的一个大错误是,sumLeaves = leaves + leaves;这实际上增加了特定(...

    由于您具有在Plant类中定义的averageLeaves(),因此您必须实际从其中一个工厂实例调用方法.这是你应该怎么做的.

    plantA.averageLeaves();

    你在这里犯的一个大错误是,

    sumLeaves = leaves + leaves;

    这实际上增加了特定(一个)植物实例的叶子,这是错误的.你必须实际传递差异实例中的叶子数.

    这是一个使用getter& amp;和更好的方法来做到这一点. setter方法.将averageLeaves()方法设为静态也是有意义的.这样您就不需要实例来调用该方法.

    public class Plant {

    int leaves;

    int age;

    //int sumLeaves; you do not need them now, as the averageLeaves method is static

    //double average;

    static void averageLeaves (int leaves1, int leaves2) {

    int sumLeaves = leaves2 + leaves1; //here is where I need help

    double average = (double) sumLeaves / 2;

    System.out.println("The average number of leaves is: " + average);

    }

    void setLeaves(int leaves){

    this.leaves = leaves;

    }

    int getLeaves(){

    return this.leaves;

    }

    }

    public class Main {

    public static void main(String[] args) {

    Plant plantA = new Plant();

    plantA.setLeaves(5);

    Plant plantB = new Plant();

    plantB.setLeaves(3);

    Plant.averageLeaves(plantA.getLeaves(), plantB.getLeaves());

    }

    }

    展开全文
  • 示例一: /** * 大厂面试题(微博、百度、腾讯): ... * 两个Integer的引用对象传递给一个swap方法的内部进行交换,返回后,两个引用的值是否会发生变化 */ public class Test001 { public static void m...
  • 我知道如何处理方法jsonObj.toString()但我有理由不能这样做....所以我想传递一个对象,而不是使用该方法.我实现Parcelable接口来做到这一点,但我得到错误“java.lang.RuntimeException:parcel:无法编组...
  • 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参  数的值。 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相...
  • cmd.Parameters.Add(new SqlParameter("存储过程输入参数变量名", 数据类型));使用这种方法不可以传递原因是数据类型是自定义类型,也不可以直接传递自定义类型如何处理,求大佬帮助一下谢谢。
  • 对象作为参数传递给方法

    千次阅读 2018-12-06 16:55:06
    (2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: public void printAreas(Cirlce c, int time) 在printAreas方法中打印输出1到time之间的每个整数半径值,以及对...
  • 在网上搜了一些方法,最后自己采用的是通过json字串的方式。 ...假设有一个php 数组 $arr,代码如下:  // html5中默认的script是javascript,故不需要特别指定script language  var arr_js = ;
  • PAGE / NUMPAGES Java 传递对象给期望原始类型参数的方法 术语 autoboxing 是指创建一个代表一个原始类型数据的对象术语 unboxing 是指创建一个代表一个对象的值的原始类型数据Java 1.5 中新的 autoboxing/unboxing ...
  • 今天在使用spring boot自带的thymeleaf模板时候,想通过form表单传递一个自定义数组对象给后端接收。可是一直出现问题,后面经过查阅资料后,发现需要把form表单提交的方式,改成ajax方法提交这个是form表单部分,...
  • (2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: public void printAreas(Circle c, int time) 在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积。例如,...
  • 今天在使用spring boot自带的thymeleaf模板时候,想通过form表单传递一个自定义数组对象给后端接收。可是一直出现问题,后面经过查阅资料后,发现需要把form表单提交的方式,改成ajax方法提交这个是form表单部分,...
  • Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements接口实现多继承的功能值传递:方法调用时,实际参数把它的值传递给对应的形式...
  • 长期以来,c和c++的程序员利用方法指针,将方法作为参数传一个方法。c#使用委托来提供相同的功能,它将方法作为对象封装起来,允许在运行时间接地绑定一个方法调用。  下面将通过冒泡排序的例子讲解委托的产生...
  • 请注意第3行和第6行的新建类的对象时的参数,根据书上的习题这样的传递参数应该是正确的,但书上的习题都只有一个参数(数据域),这个题有两个参数,编译时提示getArea()和getPerimeter()方法找不到正确的参数,...
  • BufferedOutputStream构造方法为什么不创建...就如同喝水时的水杯一样,一滴一滴水喝会觉得很慢,但是给一个水杯,将水存储到水杯中,一次性就可以喝很多水了。但是水杯只是一个媒介,最终还是需要喝的这个动作去完...
  • 长期以来,c和c++的程序员利用方法指针,将方法作为参数传一个方法。c#使用委托来提供相同的功能,它将方法作为对象封装起来,允许在运行时间接地绑定一个方法调用。 下面将通过冒泡排序的例子讲解委托的产生 ...
  • 引用传递--交换数值的问题如下代码,返回的经过了swapTest()方法后输出的i1,i2是否交换?public class SwapTest { private void swapTest(Integer i1,Integer i2){ Integer tem = i1; i1 = i2; i2 = tem; } ...
  • 可以把List传递给一个接受List参数的方法吗? A.正确 B.错误 解析,错X 原始类型可以引用一个参数化类型的对象,编译报告警告,例如, Collection c = new Vector<String>();//原来的方法接受一个集合参数,...
  • 当一个变量传递给一个方法之后,当这个变量被修改,方法中的再次读取对影的值,是否会产生变化? 下面做一个测试 首先测试一下,修改变量对象中的值,方法中再次读取是否会同时变化 public class test { public ...
  • 利用方法:public Intent putExtra (String name, Serializable value)传递一个实现了序列化接口类的对象,此方法的实参被序列化到磁盘。 方法二: 把数据存放到应用程序的“Context”中,定义MyApplication类,让其...
  • 现在出现一个问题,我在客户端调用的时候,addUser(User user)可以直接服务器传一个User对象,并且服务器端正常接收。 但是现在我getUser,客户端接收到的却是null,但是我的服务器端已经发送sql语句了,就是说...
  • java 对象作为方法的参数传递

    万次阅读 2018-03-24 14:45:25
    说到对象作为方法的参数传递的时候,大家都知道,当方法有返回值的时候,我们在其他方法定义一个接收他的对象就把他的值获取到了,可是如果不定义对象接收呐?请看方法有返回值的情况下:这种情况下,打印出来的值...
  • 值传递与对象传递

    2020-10-27 20:25:56
    就是把自身复制一个副本传给方法或其它地方被使用 本身的值不会变动 (主要有 基本类行、局部变量、字符串类) 二、引用(地址)传递 就是把自身的地址传过去别的方法或其它地方使用 本身会随着方法体的运用而改变...
  • 最近在工作中遇到了一个问题,需要接收启动脚本传递过来的实例化后的对象,通过在网上查找资料发现了两个方法,文中通过实例代码就大家详细介绍了这两种方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
  • 答案:不会 可以说Java中只有值...此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。  Java内存模...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,525
精华内容 2,610
关键字:

对象传递给一个方法