今天看到了一条代码,感觉很有意思,也正好小庆一下我的博客有博文了,今天是值得纪念的一天,未来的我会为现在的我感到自豪,话不多说。
public class Fascinating {
String no1 = new String("rejoice");
char[] ch = { 'x', 'y', 'z' };
public void reception(String no1, char ch[]) {
no1 = "displeasure";
ch[0] = 'a';
}
public static void main(String args[]) {
Fascinating fg = new Fascinating();
fg.reception(fg.no1, fg.ch);
System.out.println(fg.no1);
System.out.println(fg.ch);
}
}
就当这是一道题吧
就问no1 与 ch的值为多少.
A.displeasure ayz
B.rejoice x
C.rejoice ayz
D.displeasure x
这条代码主要有两个知识点,一个是关于类的成员变量与局部变量的关系,另一个是关于数组在方法里的调用,
首先,我们要知道成员变量是在类里声明的,其他方法可以直接调用,不需要在方法里声明,其次成员变量可以与局部变量重名,但优先级是方法里声明的变量优先级大于类里的成员变量(重点前提是同名)。
这条代码的重点是主方法调用了成员变量i并传给了reception,之后再打印no1,可以看到,结果no1打印出来的还是原值”rejoice”,这里就涉及到内存问题
局部变量在调取成员变量时,内存会分配新的存储空间将成员变量的值复制进来.
简单的说就是在方法内声明一个与成员变量名字相同值相同的变量。
所以reception方法并没有改变成员变量no1的值
reception方法只是改变了自身方法内no1的值
所以在这里如果输出reception方法里的no1的话是会打印出displeasure的
但是同样是在同一个方法内,为什么数组ch里的值却改变了,
数组在方法里调用方式不同,方法内数组的调用是将指针直接指向成员变量里的数组,也就是说方法内的数组与成员变量里的数组用同样的值,指针都指向成员变量里的值,不存在上面的”复制”,所以在打印时会将’a’替换’x’.
主要的问题就是数组在方法里的调用与其他类型不同
所以
no1 : rejoice
ch : ayz
感觉这样的代码如果基础打的不是很牢固的话是很容易弄混.
最后
可能注意到我直接打印出了数组ch,并没有给数组下标,这里也十分有趣,要注意我声明的数组为char数组,因为println()方法的重载,会直接打印出char内的每个值,并不用遍历.
我认为这段代码很有意义,很有代表性,涉及的知识点也比较多,总之还是要多练多看.
如果有人发现我写的有什么错误,请指出,我会及时更改.
我现在准备养成三天一小写,一周一大写,多多练习。