class Test
{
int a = 3;
public static void main(String[] args)
{
new Test().start()
} public void start() {
change(this.a); //分析执行过程,并做原理分析, 为何没有change,为何传递不出来》?
System.out.println(a);
change(this);
System.out.println(a); //分析执行过程,并做原理分析, 为何没有change,为何可以传递出来?
}
public void change(int a) {
a = 25;
}
public void change(Test t) {
t.a = 44;
}
}我问到了很多答案, 竟然还有说法不一的, 世界大了还真是无奇不有啊!~
很明显两个传参的方法, 丝毫不会改变任何的情况, 因为一个方法执行完之后, 如果返回结果, 就将结果返回,
如果不返回结果, 方法执行完之后,任何都不改变!~ 从这个例子中, 你能看到些什么?。 学到些什么,领悟到什么, 希望你写出自己的想法和自己所悟;
希望我们创造一个大家学习提高的机会, 不为别的, 就为奋斗而学习, 为奋斗而奋斗!
System.out.println(a);
change(this);
System.out.println(a); //分析执行过程,并做原理分析, 为何没有change,为何可以传递出来?头一个是值传递,只是给它一个值,他怎么改对原数没有影响,第二个传的是个对象,是一个地址,修改它是对对象本身内的a更改了值,
{
int a = 3;
public static void main(String[] args)
{
new Test().start()
} public void start() {
change(this.b); //分析执行过程,并做原理分析, 为何没有change,为何传递不出来》?
System.out.println(a);
change(this);
System.out.println(a); //分析执行过程,并做原理分析, 为何没有change,为何可以传递出来?
}
public void change(int b) {
b = 25;
}
public void change(Test t) {
t.a = 44;
}
}这样改下就应该清楚多了把
前一个是值传递,而在change的范围内,a是局部变量,屏蔽了Test类的成员a,故此时Test的属性a的值是不做任何改变的,而接下来的打印操作打印的是Test的属性a的值,故打印出来的是3;而第二个传的是类Test,故它会改变该代号对应的引用的值,此时Test的值会改变,故打印出来的是44。这里包括两个知识点:
(1)局部变量屏蔽,此时取局部变量的值,如果将第一个改称change(int b){a=b;},那么此时打印出来的就是25,而不是4,因为它已经改变了Test的属性成员a的值。由于这里局部变量将成员属性屏蔽了,故成员属性的值是不变的。(2)传值和传引用的问题,传引用,会直接改变对应引用的值,会改变同一段内存里面存储的值,是一个全局的改变,即一个地方改变了这个对象的值,其他地方都能反映出来。我觉得你要理解传值和传引用,一定要理解他们在内存里面的处理机制。一个引用对应一块内存地址存储的值,故你做任何改变都是对这个内存地址的值的改变,别人都会看到,就像你在教室的黑板上画了几笔,整个班上的同学都能够看到一样。而传值则不同,值对应一个变量,变量在使用它之前是没有内存地址的,使用后地址也直接释放,所以你虽然改变同一名字的变量,但改变的不是同一内存地址的值,那么你做的任何改变别人都看不到。例如,你撕一张纸,写下几句话,扔了,别人要写字的时候,再撕一张纸,也扔掉,那么你们互相都看不到了。如果你将第一个change改称change(int b){a=b;},则完全变化了,你要写字,在Test对应的内存地址的a部位写几个字,别人要写字,也在这个部分写,此时,你写的字、别人写的字都能互相看到,就能够互相影响了,呵呵,不知你能否理解!