public class Pass
{
    public void amend(int x)
    {
       x=x*2;
    }
    
    public static void main(String[] args)
    {
        int i=10;
        Pass p=new Pass();
        p.amend(i);
        System.out.println(i);
   
    }
}输出的结果为什么是10而不是20呢?
而下面这个为什么能输出list 大小为2呢?请高手指点一下,谢了。public class Pass
{    public void addList(List<String> list)
    {
        list.add("first");
        list.add("second");
    }
    public static void main(String[] args)
    {
        Pass p=new Pass();
        List<String> list=new ArrayList<String>();
        p.addList(list);
        System.out.println(list.size());
    }
}

解决方案 »

  1.   

    这个问题讨论过好多回了哦
    第一个x 与 i不是同一个变量
    第二个 list与main里的list虽然也不是同一个引用,但是指向同一个对象,对对象本身的操作会相互影响
      

  2.   

    int i=10;
            Pass p=new Pass();
            p.amend(i);
            System.out.println(i);
    打印的还是打印 i 的值
      

  3.   

    java的参数传递有两种
    1:基本类型,传递这个基本类型的副本,不会改变被传递参数的值
    2:对象类型,传递这个对象的值,因为java没有指针,所以仅仅可以改变参数的内部状态,不可以改变它的重新指向,
    也就是说通过参数传递做重新赋值是无效的,LZ的例子是在list里添加一个元素是改变list的状态,所以大小是2了
      

  4.   

    public class Pass
    {
        public void amend(int x)
        {
           x=x*2;
        }
        
        public static void main(String[] args)
        {
            int i=10;
            Pass p=new Pass();
            p.amend(i);
            System.out.println(i);
       
        }
    }int i=10; ------内存中 i=10;
    p.amend(i); -----------内存中增加 x=10   执行 x=x*2 后 x=20; 并且x是局部变量 System.out.println(i); ------------ i=10public class Pass
    {    public void addList(List<String> list)
        {
            list.add("first");
            list.add("second");
        }
        public static void main(String[] args)
        {
            Pass p=new Pass();
            List<String> list=new ArrayList<String>();
            p.addList(list);
            System.out.println(list.size());
        }
    }p.addList(list);
    list传递的是一个(栈中)地址,其指向(堆)一块内存
    1、原始数据类型(primitive type)作为参数传递
    根据资料显示,Java中原始数据类型传递时是传值。实验一下,代码如下:
     
    public class ParameterPassingAsPrimitiveType 

            public static void main(String args[]) 
            { 
                    int intType = 13; 
                    System.out.println("修改原始类型参数值前:intType = " + intType); 
                    changeValue(intType); 
                    System.out.println("修改原始类型参数值后:intType = " + intType); 
            } 
             
            public static void changeValue(int intType) 
            { 
                    intType = 14; 
            } 
    }
    输出结果:
    修改原始类型参数值前:intType = 13 
    修改原始类型参数值后:intType = 13
    由此可以看出,传入的值是原始值(intType)的一个副本,在函数中修改了参数不会影响到原始值。
     
    2、对象作为参数传递
    先看代码:
    public class ParameterPassingAsObject 

            public static void main(String args[]) 
            { 
                    StringBuffer aObject = new StringBuffer("Good"); 
                    System.out.println("修改对象前aObject = " + aObject); 
                    changValue(aObject); 
                    System.out.println("修改对象后aObject = " + aObject); 
            } 
            public static void changValue(StringBuffer bObject) 
            { 
                    bObject.append(" affternoon"); 
            }        
    }
    运行结果如下:
    修改对象前aObject = Good 
    修改对象后aObject = Good affternoon
    看输出,对象被修改了,可以被理解为传址(传引用)了?是否真是这样呢?看一下下面的代码再说:
    public class ParameterPassingAsObjectOther 

            public static void main(String args[]) 
            { 
                    StringBuffer aObject = new StringBuffer("Good"); 
                    System.out.println("修改对象之前aObject = " + aObject); 
                    changeValue(aObject); 
                    System.out.println("修改对象之后aObject = " + aObject); 
            } 
            public static void changeValue(StringBuffer bObject) 
            { 
                    bObject = new StringBuffer("new"); 
                    bObject.append(" world"); 
            } 
    }
    本段代码的运行结果:
    修改对象之前aObject = Good 
    修改对象之后aObject = Good
      

  5.   

    第一种是值传递  第二种是传对象 也就是地址List<String> list=new ArrayList<String>();这句话我看不懂 如果是向上转型 这里好像没有继承关系吧
    这个List<String>是个引用变量吗   也没看到类啊  
    可能我才疏学浅吧
      

  6.   

    List <String> jdk1.5以上的新功能泛型,也就是说你这个List中只能存放String类型
      

  7.   

    楼主的问题是值类型与引用类型的区别,x为值类型,直接传值过去,不会改变其本身,list为引用类型,传的是地址,list对象中本有一条数据,你在另一个地方向这个地址里添加了数据,所以它的值改变了。网上相关的问题较多,可参考