在java中形参和实参在存放在一个内存单元还是分别存放在两个不同的内存单元

解决方案 »

  1.   

    JAVA传递参数有两种方式:值传递和引用传递
    值传递是传递数据:象基本数据类型都是值传递
    引用传递是把形参和实参的指针指向了堆中的同一对象
      

  2.   

    JAVA传递参数有两种方式:值传递和引用传递 
    值传递是传递数据:象基本数据类型都是值传递 
    引用传递:对象的引用和数组的引用。
      

  3.   

    两个不同的内存单元,java参数传递只有值传递
      

  4.   

       一般情况下,形参是分配在栈空间的,而实参就要分情况了,举例:
       情况1:如果实参是基本类型,public class Test {
      public static void main(Sting[] args) {
        int a = 3;
        int b = 4;
       
        method(a, b);//调用方法method,传递实参a=3,b=4,此时实参也是分配在栈内存的。
      }
      
      void method(int x, int y) {
       .....
      }
    }   情况2:如果实参是引用类型,public class Test {
      public static void main(Sting[] args) {
       String s = new String("abc");
        method(s);//调用方法method,传递实参s="abc",此时实参还是分配在栈内存的。但要注意,此时分配在栈内存的只是一个String类型的变量s,而
    “abc”是分配在堆内存的。
        如果将将method(s);写成method("abc");就不一样了,此时实参是一个分配在Data Segment区的字符串常量。
      }
      
      void method(String s) {
       .....
      }
    }
             
      楼主可以看看内存分配的知识就知道了,有不明白的可以问我。
      希望我的回答能帮助你。
      

  5.   

    楼上:如果将将method(s);写成method("abc");就不一样了,此时实参是一个分配在Data Segment区的字符串常量。
    请问,“abc”不是分配在String池中吗?
    迷糊~~
      

  6.   

    都是在胡说。
    什么是形参?形参在JAVA中就是方法的参数签名,它根本就不会分配任何空间,它连同方法名本身就是一个Method对象
      

  7.   

    答:你才是胡说.形参是在方法调用时(运行时),由编译程序生成的方法的入口指令在方法的栈中完成空间分配的.生成的入口指令(目的:用于建立栈中的Frame结构).这样,编译好后的代码中,访问原来形参变量如:i的地方,都已由类似[bp-offset]形式的栈位置的引用来取代. 方法调用时,实参值先压进栈,这些压进栈的位置,正是形参的空间位置.而这一点:正是所谓的"形参与实参的结合".你先自己彻底搞清楚编译的内部清况,不要动不动就是别人的胡说.
      

  8.   

    如果是基本数据类型,例如int,char这些,是值传递,再函数内部用完也释放了,内部是新开辟的拷贝,不影响实参,
    如果是不可变对象,比如String,对String得操作,是不会影响实参得,因为String对象生成以后就再也不会改变,
    如果是可变对象,比如自定义的对象,传递得是引用,函数内部是另外一个引用,即形参和实参都指向同一个对象,是对同一个对象操作,这和C++得引用是类似得,当然引用也是占内存的!
      

  9.   

    ]到底谁在搞笑?
    形参,就是方法调用时的“参数模板”,简单说在生成方法栈中分配多少空间供实参压入,这个空间仅仅是保留给实参用的,因为形参连同它的方法名和返回值作为一个方法签名(方法原型)已经被常驻在一个特定区域。就象一个类的class对象,在方法调用时绝对不会为形参分配空间。简单说形参其实是在方法栈中如何分配参数(实参)的原则,它自己根本就不需要分配空间!(当然方法签名本或方法原型本身是有空间的,但那不叫来形参分配空间)
      

  10.   

    答:简单说在生成方法栈中分配多少空间供实参压入,这个空间,就是形参的空间啊.编译在生成访问形参i的地方,都换成访问该i在栈中的空间即:[bp-offset]的形式.即:编译程序在生成指令时,使用形参变量的地方,就是生成指令使用这些空间啊.
    它们就是形参的空间啊.