public class Mytemp {
private static int s = 100;
private static String[] ss = {"a","b","c"};

public static void main(String[] agrs){
Mytemp u = new Mytemp();
System.out.println("b-->"+s);
System.out.println("b-->"+ss[0]);
u.change(s, ss);
System.out.println("a-->"+s);
System.out.println("a-->"+ss[0]);
}

public void change(int s,String[] ss){
s=50;
ss[0]="k"; }
}
执行结果:b-->100
b-->a
a-->100
a-->kss[0]的值变了,s的值没有变,请教原因??

解决方案 »

  1.   

    int是值类型,string数组时引用类型,两者使用时是传值和传址调用的不同,你可以研究一下关于堆栈的问题,应该会清楚。
      

  2.   

    public void change(int s,String[] ss){
    s=50;//此处的s是这个方法的参数s,不是静态变量s。
    //Mytemp.s = 50;或this.s = 50;才对,但后者的写法不是很规范。
    ss[0]="k";//此处的ss是类静态变量ss的引用地址,通过这个地址进行操作,当然是类静态变量ss受影响
    /*
     * java方法的参数传递只有值传递,不存在引用传递这个概念,只不过是:
     * 八大基本类型直接传值,引用类型传的值是对象的引用地址。
     * int是基本类型,int数组是引用类型。
     */
    }
    个人理解。
      

  3.   

    s=50;  不等于 this.s----------------------
      

  4.   

    值传递估计能在CSDN找出上百贴了。
    基本类型 你这里的int :参数传递的是 该对象的拷贝---这里说拷贝其实是不准确的,看后面的解释。
    引用类型 你这里的String[] :参数传递的是 引用的拷贝。这个问题对初学者确实很痛疼。再加上String的不可变性够让人头疼的了。如果你想对这个问题有深入理解的话可以去看看常量池相关的东西,我这里说下我的理解:首先,常量池顾名思义,就是放了一些常用的东西----基本类型和String.这个东西在内存上比较特别是在栈上的,对它里面的东西的读写都比较快,常量池是在编译器初始化的,这也是为了效率。既然说是常量池,那么它里面的东西就具有不可变性,为什么不可变呢,其实主要还是效率的问题。
    比如说:int a  = 1;
    a=a+1;这个操作做了如下的事情:首先 查找常量池中是否有1(像1这样的比较常用的是肯定有的),有就直接把a 指向1 ,没有就在栈中创建。,这些事情是在编译器完成的。a=a+1;这个操作并没有修改a指向的那个1,而是去常量池中找2,如果有就把a指向2,而原来的1还在那里。没有就往常量池中放2.所以
    public void change(int s,String[] ss){
    s=50;
    ss[0]="k";}

    这里的s其实也是和

    private static int s = 100;

    的s指向同一个 常量池中的100,不过当你执行
    s=50;时 jvm 并不会去改变原来的100,而是让

    private static int s = 100;

    中的s重新指向了50.
    这个很关键。至于String 数组,就按照一般的去理解就可以了。
      

  5.   

    在java中,   对象,即用new   来产生的东西(也包括数组,new   int[10])是用引用的方法,
    所有基本类型(int,   long,   double,   boolean,   char,   byte   .....)是传值,
    不过他们也有向对应的封装类,在java.lang中   
      (Integer,   Boolean,   Character....).java.lang.String是一个例外,它可以用+,+=两个符号,所以是值引用public class T2 {



    public static void main(String[] args) {
    int a = 1;
    int b = 5;
    //operate(a, b);
    System.out.println("a=" + a + ",b=" + b);
    Integer ab = new Integer("1");
    Integer bb = new Integer("5");
    ch(ab,bb);
    System.out.println("ab=" + ab + ",bb=" + bb);

    String abc = "1";
    String bbc = "5";
    ch(abc,bbc);
    System.out.println("abc=" + abc + ",bbc=" + bbc);

      int s = 100;
      String[] ss = {"a","b","c"};
    System.out.println("b-->"+s);
    System.out.println("b-->"+ss[0]);
    change(s, ss);
    System.out.println("a-->"+s);
    System.out.println("a-->"+ss[0]);

    String sbc = "100";
      StringBuffer sb = new StringBuffer("a");
    System.out.println("b-->"+sbc);
    System.out.println("b-->"+sb);
    change(sbc, sb);
    System.out.println("b-->"+sbc);
    System.out.println("b-->"+sb);
    } static void operate(int x, int y) {
    x++;
    y++;
    }  static void ch(Integer x, Integer y) {
    x++;
    y++;
    }
     
     static void ch(String x, String y) {
    x = x+"00";
    y = y+"00";
    System.out.println("abc=" + x + ",bbc=" + y);
    }
     
     static void change(int s,String[] ss){
     s=50;
     ss[0]="biek";  }
     static void change(String s,StringBuffer ss){
     s=s+"1";
     ss.append("nihao");  }
    }
      

  6.   

    局部变量s和全局变量s
    还有是地址的传递和值的传递是不一样的
    ss是地址传递而s是值传递并且
    public void change(int s,String[] ss){
    s=50;
    ss[0]="k";}
    这个函数中的s=50;不是赋给了private static int s = 100;
    这个s所以s的值不会改变的
      

  7.   

    因为数组是一个复合数据类型,而且数组保存的String 类型,String 类型也是复合数据类型。
    一般都是保存都是它的地址。