OCJP的误解

时间:2015-02-10 13:27:40

标签: java

我准备参加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

有人可以解释我为什么吗? 谢谢!

3 个答案:

答案 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

这就是为什么该值不会在该步骤中发生变化