请问在java中,用类作为函数参数时,这个类是类的本身还是格外的镜像?
就是说,在一个函数的参数中使用了某个类,然后在函数中对类中元素进行更改,
那么类中的元素就被修改了,如下面的例子。
这个是函数处于的类;
public class nstest {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
nstest t=new nstest();
ns t1=new ns();
t.change(t1);
System.out.println(t1.content);
}

public boolean change(ns t)
{
t.content="false";
return true;
}}
----------------------------------------------------------------
这个是被操作的类:
public class ns {
public String content="ok";
}
-----------------------------------------------------------------------------
执行的结果是:
false
---------------------------------------------------------------------
我们原来不是说形参和实参的区别么?
int i=0;
add(i);
printf("%d",i);void add(i)
{
i++;
}
执行结果不还是0么?请各位大侠不吝赐教

解决方案 »

  1.   

    如果参数是一个对象,它是这个对象地址的一个复本。
    也就是说,它知道对象的位置,所以你改变这个地址的内容,这个地址的内容就会发生改变。
    但是如果你是将这个地址(参数对象的地址复本)指向其他对象,参数对象的地址不会发生改变。
    基于此,很多专家都认为java全部都是值传递,不存在形参的说法。但是为了便于理解,往往把对象参数视为形参,因为从表象上看,它和形参的行为极为相似,如果对参数对象的member进行操作,毕竟该对象的member会发生改变。
      

  2.   

    public boolean change(ns t)
    {
    t=new ns();     //引用的复本改变。
    t.content="true";
    return true;
    }
    //输出为"OK"。
      

  3.   

    把你的代码改为下面:
    package test;public class Nstest {
    /**
     * @param args
     */
    public static void main(String[] args) {
    //  TODO Auto-generated method stub
    Nstest t=new Nstest();
    Ns t1=new Ns();
    Ns t2 = new Ns();
    t.change(t1);
    System.out.println(t1.content);
    System.out.println(t2.content);
    }
    public boolean change(Ns t)
    {
    t.content="false";
    return true;
    } }
    // ----------------------------------------------------------------
    // 这个是被操作的类:
    class Ns {
    public String content="ok";
    }你就会看到输出结果为:
    false
    ok
    你就明白了t.change(t1);只是改变了实例(instance)中的值,并没有改变类中的值.
      

  4.   

    其实还是有很多地方不明白。
    各位都说实例的问题,但是实例不也有成员么?如变量和函数。
    那多个实例之间的成员还有什么关系么?
    当然,这里不设计static的问题。
      

  5.   

    java 中类的传递还是指针传递 只不过是常量指针  当作为参数传递时 方法中形参实质上保存
    的是地址,可以通过反引用去调用该类的方法
    基本变量 是传值
      

  6.   

    我归结一下,是不是这样的。
    java中,类的调用,是指针地址的调用。这样就可以对类进行各种操作,类中的成员也可以被更改。但是若是传入变量型类型,则传入的是一个副本,对其做的更改不回反弹会原变量。
      

  7.   

    class Test {


     int add(int i) {
            i++;
            return i;
        }
       
    }
     class Main{
    public static void main(String arg[]){

    Test t=new Test();


    System.out.println(t.add(0));
     }
    }结果为1
      

  8.   

    int i=0;
    add(i);不可以用型参传值,要用实参
    printf("%d",i);输出的结果是上面 int i=0的值,根本没有调用add方法void add(i)
    {
    i++;
    }
    空的返回值类型,怎么把值传回去?除非你把输出放在里面而不是上面
    void add(int i){
    i++;
    System.out.print(i);
    }
      

  9.   

    public class Atest /*extends Test*/{public static void main(String[] args)
    {
    Atest at=new Atest();
    Test te=new Test();
    Test te2=new Test();
    at.st(te);
    System.out.println(te.content);
    System.out.println(te2.content);
    te2.content=te.content;
    System.out.println(te.content);
    System.out.println(te2.content);
    }
    public /*boolean*/void st(Test t)
    {
    //t=new Test();
        System.out.println(t.content);
    t.content="false";
    //return true;
    }
    }class Test{ static String content="aaa";}