当前页面: 开发资料首页 → 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";
}