java类赋值问题!
------------------------------------------以下是代码区域------------------------------------...
------------------------------------------以下是代码区域---------------------------------------------------------------
public class zhichuandi {
public static void main(String[] args) {
C c = new C();
System.out.println(c.i);
c.seti(10);
System.out.println(c.i);
fun(c);
System.out.println(c.i);
}
static void fun(C c)
{
C cc = new C();
System.out.println("cc"+cc.i);
c = cc;
}
}
class C
{
int i = 15;
void seti(int x)
{
i = x;
}
};
------------------------------------------以上是代码区域---------------------------------------------------------------
输出是:
15
10
cc15
10
为什么fun执行完后c的仍然是10,没有变成15呢? 展开
public class zhichuandi {
public static void main(String[] args) {
C c = new C();
System.out.println(c.i);
c.seti(10);
System.out.println(c.i);
fun(c);
System.out.println(c.i);
}
static void fun(C c)
{
C cc = new C();
System.out.println("cc"+cc.i);
c = cc;
}
}
class C
{
int i = 15;
void seti(int x)
{
i = x;
}
};
------------------------------------------以上是代码区域---------------------------------------------------------------
输出是:
15
10
cc15
10
为什么fun执行完后c的仍然是10,没有变成15呢? 展开
展开全部
如果是在C语言或者C++里面,你的疑惑都是最基础的知识,也比较好解释。但是java里面,不好解释这个问题,因为很多概念,java语言给你隐藏了的。
比如说 static void fun(C c){} 这个函数被调用的时候,实际上,传递过来的是 c对象的内存地址。内存地址是一个特殊的变量,它的长度和当前机器位宽有关,如果是32机器,那它就是个32位整数,即最大为0xFFFFFFFF的一个数字。
比如 C c1 = new C() ; fun(c1); 这两句代码执行的时候,在fun内部的c和外面的c1 实际上是两个不同的引用变量,只不过它引用的是同一个对象。对应底层内存的解释即,c和c1它们是两个内存地址变量,它们存防的都是同一个地址,即对象 c1对象的地址。总的来说就是两个引用变量本身是不同的,但它们引用的却是同一个对象。
如果想学好java,建议还是从C学起,很多概念,比如堆栈,地址,引用(指针),引用拷贝,值拷贝这些都可以有深入的了解。学C和java并不矛盾,只不过C在很多概念上对学习者透明,也有比较多的文档可以了解,而java方面则没有这么多教程。。
学C 就像学造房子的人从怎么生产砖瓦开始。
学java就像学早房子,一上来就给你讲房子的美观,布局,以及通风采光。所以就容易产生这些疑惑
比如说 static void fun(C c){} 这个函数被调用的时候,实际上,传递过来的是 c对象的内存地址。内存地址是一个特殊的变量,它的长度和当前机器位宽有关,如果是32机器,那它就是个32位整数,即最大为0xFFFFFFFF的一个数字。
比如 C c1 = new C() ; fun(c1); 这两句代码执行的时候,在fun内部的c和外面的c1 实际上是两个不同的引用变量,只不过它引用的是同一个对象。对应底层内存的解释即,c和c1它们是两个内存地址变量,它们存防的都是同一个地址,即对象 c1对象的地址。总的来说就是两个引用变量本身是不同的,但它们引用的却是同一个对象。
如果想学好java,建议还是从C学起,很多概念,比如堆栈,地址,引用(指针),引用拷贝,值拷贝这些都可以有深入的了解。学C和java并不矛盾,只不过C在很多概念上对学习者透明,也有比较多的文档可以了解,而java方面则没有这么多教程。。
学C 就像学造房子的人从怎么生产砖瓦开始。
学java就像学早房子,一上来就给你讲房子的美观,布局,以及通风采光。所以就容易产生这些疑惑
追问
恩 我学过C的 执行fun(c);时 c是地址传到,所以在fun函数对c的改变都应该会影响main函数中的c,但是不知为什么返回去后还是没变
追答
static void fun(C c) { C cc = new C(); System.out.println("cc"+cc.i); c = cc; //注意,这里,这里。。这里给c赋值,只是局部变量 c的值改变了,并没有改变最外面的那个fun(c); 中的c的值。 如果你想知道java中的引用变量的实际值,可以这样, 比如 Object obj 它的 obj.hashCode()将返回一个 int值,它是一个类似的地址的东西。你可以在调用func(c) 之前和只后,赋值的前后,打印 c的 hashCode观察具体变化。另外,像把代码发出来问问题,你的变量名要讲究点,别全都是c,人都不好给你说是哪个c。
对了,某些特殊的类会重载 hashCode函数,比如String,它的hashCode 是另一种含义。 }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询