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;
}
}我问到了很多答案, 竟然还有说法不一的, 世界大了还真是无奇不有啊!~

很明显两个传参的方法, 丝毫不会改变任何的情况, 因为一个方法执行完之后, 如果返回结果, 就将结果返回,
如果不返回结果, 方法执行完之后,任何都不改变!~  
从这个例子中, 你能看到些什么?。 学到些什么,领悟到什么,  希望你写出自己的想法和自己所悟;
希望我们创造一个大家学习提高的机会, 不为别的, 就为奋斗而学习, 为奋斗而奋斗! 

解决方案 »

  1.   

    change(this.a);               //分析执行过程,并做原理分析, 为何没有change,为何传递不出来》?
    System.out.println(a);
    change(this);
    System.out.println(a);        //分析执行过程,并做原理分析, 为何没有change,为何可以传递出来?头一个是值传递,只是给它一个值,他怎么改对原数没有影响,第二个传的是个对象,是一个地址,修改它是对对象本身内的a更改了值,
      

  2.   

    首先你记住一点 Java中只有值传递  然后就是一个作用域的问题  
      

  3.   

    class Test 
    {    
        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;
        }
    }这样改下就应该清楚多了把  
      

  4.   


    前一个是值传递,而在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部位写几个字,别人要写字,也在这个部分写,此时,你写的字、别人写的字都能互相看到,就能够互相影响了,呵呵,不知你能否理解!