我准备参加OCJP考试,我有一个棘手的问题。我不知道为什么正确答案是下一个答案:" B。 300-300-100-100-100" 问题听起来像这样:
1. class Foo {
2. private int x;
3. public Foo(int x) {
4. this.x = x;
5. }
6. public void setX(int x) {
7. this.x = x;
8. }
9. public int getX() {
10. return x;
11. }
12. }
13. public class Gamma {
14. static Foo fooBar(Foo foo) {
15. foo = new Foo(100);
16. return foo;
17. }
18. public static void main(String[] args) {
19. Foo foo = new Foo(300);
20. System.out.println(foo.getX() + "-");
21. Foo fooBoo = fooBar(foo);
22. System.out.println(foo.getX() + "-");
23. System.out.println(fooBoo.getX() + "-");
24. foo = fooBar(fooBoo);
25. System.out.println(foo.getX() + "-");
26. System.out.println(fooBoo.getX() + "-");
27. }
28. }
坦率地说,我应该得到正确的回答#34; A。 300-100-100-100-100"因为在第15行,foo引用被更改为一个新的Foo对象,它具有实例变量x = 100,并且我不知道为什么在第22行foo引用是"旧对象"实例变量x = 300
有人可以解释我为什么吗? 谢谢!
答案 0 :(得分:5)
内联解释:
public static void main(String[] args) {
19. Foo foo = new Foo(300);
20. System.out.println(foo.getX() + "-"); // 300
21. Foo fooBoo = fooBar(foo); // foo is "unchanged" here
22. System.out.println(foo.getX() + "-"); // printing foo --> 300
23. System.out.println(fooBoo.getX() + "-"); // printing fooBoo --> 100
24. foo = fooBar(fooBoo); // changing foo and setting it to 100
25. System.out.println(foo.getX() + "-"); // So foo will be --> 100
26. System.out.println(fooBoo.getX() + "-");// fooBoo is already -->100
27. }
答案 1 :(得分:3)
第24行更改了对foo变量的引用。第15行没有更改。因为原始foo被静态方法fooBar的本地foo变量隐藏。
答案 2 :(得分:0)
这就是对象在Java中的工作方式
Foo fooBoo = fooBar(foo); // here foo ---> 300
// function fooBar call
foo = new Foo(100);
这一行将创建指向100的新foo对象,因此它看起来像这样
foo (passed to method) ----> 300
foo (created inside method) ---> 100
这就是为什么该值不会在该步骤中发生变化