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

冠鸟 2015-02-14 12:30:16
为何调用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
...全文
1023 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuqun0036 2015-02-28
  • 打赏
  • 举报
回复
值类型,引用类型
yudi010 2015-02-28
  • 打赏
  • 举报
回复
此题考查的是值和类型的传值问题, 但是出这个题目的人绝对煞笔 请问 有在方法内使用和全局变量一样的吗 你在类中定义了x 那么你在show方法中可以使用y等,这不是混淆吗? 不要说没有经验的 即使有经验的 也会在如此定义中认识出错,给以后的调试程序非常不便利 所以 出题们的人纯属煞笔
日知己所无 2015-02-28
  • 打赏
  • 举报
回复
【说明】 方法重载 : 是让类以统一的方式处理不同类型数据的一种手段。【方法名相同,参数类型不同】 #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的处理,以使得回答更有说服力一些
日知己所无 2015-02-28
  • 打赏
  • 举报
回复
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
日知己所无 2015-02-28
  • 打赏
  • 举报
回复
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
  • 打赏
  • 举报
回复
传t ,jvm会调用public static void show(TestJava t) 此方法,传t.x ,JVM会调用public static void show(int x) 此方法,这么简单的问题还用问?
sunlei638 2015-02-27
  • 打赏
  • 举报
回复
类的多态问题,一个实参是基本类型,一个是类对象,int x 不是局部(本地)变量,是全局变量。
yinweis 2015-02-27
  • 打赏
  • 举报
回复
首先注意X为 实例变量,不共享内存。其次show方法涉及多态,一个传int型(变量)一个传TextJava型(对象),传的为into型不改变实例变量值,传对象时会改变,这就是问题的关键
huangan0301 2015-02-27
  • 打赏
  • 举报
回复
引用 19 楼 huangan0301 的回复:
public static void show(int x) { x = 4; } 该x只是方法中的局部,与类中的成员变量x是两码事。该方法的参数名称可以改为任意名称。
少了变量2字
huangan0301 2015-02-27
  • 打赏
  • 举报
回复
public static void show(int x) { x = 4; } 该x只是方法中的局部,与类中的成员变量x是两码事。该方法的参数名称可以改为任意名称。
liujb114 2015-02-27
  • 打赏
  • 举报
回复
传t.x时,改的对象与现在NEW出来的t不是同一样,所以还是1.
三仙半 2015-02-27
  • 打赏
  • 举报
回复
调用show(t.x)时,方法修改的是方法的参数,是一个局部变量,不是对象的成员变量 而调用show(t)时修改的是t的成员变量的值
  • 打赏
  • 举报
回复
值类型跟引用类型的区别呗!
Usher丶AckMan 2015-02-26
  • 打赏
  • 举报
回复
楼上正解!!!!!
大力夯 2015-02-26
  • 打赏
  • 举报
回复
引用 11 楼 u010880076 的回复:
这个不是值类型与引用类型的问题吗?? 你传个t.x时相当于是传入一个int类型,int类型是个值类型,只传入了值给你方法中的x,而不是t的x,所以 你打印的t.x是没有变化的。。。
楼上正解 就是一个局部变量 把脑壳整昏了哇
xxb_zrx 2015-02-26
  • 打赏
  • 举报
回复
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,两则只是定义的名称相同,具有一定的迷惑性。 第二个是对象传递,就是本身参数的传递赋值。
程序袁_哈哈 2015-02-26
  • 打赏
  • 举报
回复
这个不是值类型与引用类型的问题吗?? 你传个t.x时相当于是传入一个int类型,int类型是个值类型,只传入了值给你方法中的x,而不是t的x,所以 你打印的t.x是没有变化的。。。
anythingforyou 2015-02-26
  • 打赏
  • 举报
回复
wy963971867 2015-02-26
  • 打赏
  • 举报
回复
楼上已经很完美的解决你的问题了。
u010998469 2015-02-26
  • 打赏
  • 举报
回复
引用 5 楼 zds612 的回复:
[quote=引用 4 楼 u010998469 的回复:] --当参数为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 对吧? [/quote]没听明白你说的意思。
加载更多回复(7)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧