当前位置: 代码迷 >> J2EE >> 考验Java基础的一道试题。请大家回答,多谢
  详细解决方案

考验Java基础的一道试题。请大家回答,多谢

热度:54   发布时间:2016-04-17 23:19:30.0
考验Java基础的一道试题。请大家回答,谢谢。
为何调用show方法,输入参数为 t.x 和 t 时,打印出来的结果,不一样??请求帮助。
public class TestJava {
    int x = 1;
    public static void main(String[] args) {
        TestJava t = new TestJava();
        show(t.x);//将参数改为t,为何输出结果不同?
        System.out.print(t.x);//如果将上一行改为show(t),输出结果为何不同?
    }
    public static void show(int x) { 
        x = 4;
    }
    public static void show(TestJava t) {
        t.x = 3;
    }
}
show(int x)在调用时,是否在栈中初始化一个局部变量x=0
------解决思路----------------------
我也是看了两页基础的小白

运行了一下,传t.x,则打印1

传t则打印3

根据楼上大侠所说,传 t.x ,会传给参数类型是int的方法(貌似这就叫多态是吧)

但是实际传t.x,结果还是1,why ?

谢谢!
------解决思路----------------------
--当参数为t.x时,程序调用show(int x)方法,调用这个方法的原因不用解释了吧,在这个方法里面你x=4只是将方法的参数x做了新的赋值并没有对t这个对象里的x重新赋值;所以结果仍是1
--当参数为t的时候,程序调用show(TestJava t),你传进去的是当前类的一个实例对象,在这个方法里面你重新给这个对象也就是t.x赋值,那么针对改对象t的x值在内存中就有了新的值,所以结果是3

最后 你如果重新new一个对象,打印x值,结果仍然是1
希望能帮到你
------解决思路----------------------

引用:
--当参数为t.x时,程序调用show(int x)方法,调用这个方法的原因不用解释了吧,在这个方法里面你x=4只是将方法的参数x做了新的赋值并没有对t这个对象里的x重新赋值;所以结果仍是1
--当参数为t的时候,程序调用show(TestJava t),你传进去的是当前类的一个实例对象,在这个方法里面你重新给这个对象也就是t.x赋值,那么针对改对象t的x值在内存中就有了新的值,所以结果是3

最后 你如果重新new一个对象,打印x值,结果仍然是1
希望能帮到你


t传递的是内存使用权

t.x传递的并不是内存地址,x != t.x

对吧?

------解决思路----------------------



引用:
我也是看了两页基础的小白

运行了一下,传t.x,则打印1

传t则打印3

根据楼上大侠所说,传 t.x ,会传给参数类型是int的方法(貌似这就叫多态是吧)

但是实际传t.x,结果还是1,why ?

谢谢!

传t.x调用的是show(int x)这个方法,传进去的参数是x,x是1,虽说已经执行了x=4,但是,类变量那个int x=1并没有变,变的只是show(int x)这个x,因为这个方法是静态的,类还没有new的时候就已经加载了,但你的类变量不是静态的,new之前并没有加载,所以当你new了之后x还是1,就算你后面调用了那个方法,除非你这个方法不是静态的,否则他不会改变类变量x的值,所以还是1,而调用第二个方法你传的是个对象,这个对象已经new了,所以他会改变对象里面的类变量x的值,所以输出就是3了
------解决思路----------------------
public static void show(int x) { 
        x = 4;
    }
    public static void show(TestJava t) {
        t.x = 3;
    }
第一个只是值传递,不是参数传递,也就是说传递的是x=4中的这个4,而不是x这个参数,而方法体内的x可以说和外部的x没有任何关系,而且 x = 4这个只是修改局部变量(也就是方法头中定义的变量),并非全局变量x,两则只是定义的名称相同,具有一定的迷惑性。
第二个是对象传递,就是本身参数的传递赋值。
------解决思路----------------------
public class TestJava1 {
    int m_x = 1;

    public static void main(String[] args) {
        TestJava1 t = new TestJava1();
        show(t.m_x);//将参数改为t,为何输出结果不同?
        System.out.print(t.m_x);//如果将上一行改为show(t),输出结果为何不同?
    }

    public static void show(int p_x) {
        System.out.println("show(int p_x):Start");
        p_x = 4;
        System.out.println("show(int p_x):End");
    }

    public static void show(TestJava1 t) {
        System.out.println("show(TestJava1 t):Start");
        t.m_x = 3;
        System.out.println("show(TestJava1 t):End");
    }
}


show(int p_x):Start
show(int p_x):End
1

------解决思路----------------------
public class TestJava3 {
    int m_x = 1;

    public static void main(String[] args) {
        TestJava3 t = new TestJava3();
        show(t);//将参数改为t,为何输出结果不同?
        System.out.print(t.m_x);//如果将上一行改为show(t),输出结果为何不同?
    }

    public static void show(int p_x) {
        System.out.println("show(int p_x):Start");
        p_x = 4;
        System.out.println("show(int p_x):End");
    }

    public static void show(TestJava3 t) {
        System.out.println("show(TestJava1 t):Start");
        t.m_x = 3;
        System.out.println("show(TestJava1 t):End");
    }
}


show(TestJava1 t):Start
show(TestJava1 t):End
3

------解决思路----------------------
【说明】
方法重载 : 是让类以统一的方式处理不同类型数据的一种手段。【方法名相同,参数类型不同】

#25的第6行,show(t.m_x);在调用时,参数类型是基本类型int,所以根据log走的是show(int p_x)
#26的第6行,show(t)在调用时,参数类型是类TestJava3,所以根据log走的是show(TestJava3 t)

【补充】
为了便于理解,代码的变量名称进行了微调
类的成员变量,加上了m_代表member
方法的参数,加上了p_代表parameter
由于要同时输出两种结果,以便于比较,把类的名字根据输出结果进行了调整,分别加上了1和3
另外额外加上了一些输出log的处理,以使得回答更有说服力一些
  相关解决方案