站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题问一个函数调用类的问题

问一个函数调用类的问题

摘要: 问一个函数调用类的问题


请问在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么?

请各位大侠不吝赐教


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


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


把你的代码改为下面:
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)中的值,并没有改变类中的值.


学习中...


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



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



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



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



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);
}



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";

}


↑返回目录
前一篇: tomcat 是干什么用的啊?不明白
后一篇: 初学者的第一个问题