2015-03-24 5 views
0
class Box { 
    int size; 

    Box(int s) { 
     size = s; 
    } 
} 

public class Laser { 
    public static void main(String[] args) { 
     Box b1 = new Box(5); 
     Box[] ba = go(b1, new Box(6)); 
     ba[0] = b1; 
     for (Box b : ba) 
      System.out.print(b.size + " "); 
    } 

    static Box[] go(Box b1, Box b2) { 
     b1.size = 4; 
     Box[] ma = { b2, b1 }; 
     return ma; 
    } 
} 

What the result? 
A. 4 4 
B. 5 4 
C. 6 4 
D. 4 5 
E. 5 5 
F. Compilation fails 

Ответ являетсяВызова ссылочного-или- вызова по значению

Я имею трудное время, пытаясь понять результаты этого кода. Может ли кто-нибудь объяснить мне результаты?

ответ

3

Вот некоторые объяснения -

1. Прежде всего, вы должны создать в главном в Box() класса -

Box b1 = new Box(5); 

2. Затем отправить b1 идти() метод -

Box[] ba = go(b1, new Bo(6)); 

Теперь b1.size является 5

3. В методе Go() вы устанавливаете b1.size 4 с помощью оператора присваивания -

b1.size = 4; 

4. Теперь вы создаете новый массив Boxma -

Box[] ma = { b2, b1 }; 

В этом массиве первый элемент b2 и b2.size равен 6. См пункт 2.

5. Затем вы возвращаетесь ma и в точке 2 возвращаемый массив ma присваивается ba , Теперь первый элемент массива 6 и второй элемент массива 4.

6.ba[0] = b1; - это оператор устанавливает первый элемент ba[0] в b1. Обратите внимание на пункт 2 b1.size был установлен 4.

Теперь ba[0].size является 4
и ba[1].size является 4

И поэтому выход 4 4

+1

В пункте 1 в ящике b1 = новый блок (5); мы создаем переменную или массив длиной 5? – Programmer345

+0

Мы создаем новую переменную 'b1' типа' Box'. В java мы создаем массив следующим образом: 'int [] intArray = new int (5)'. – Razib

+0

Таким образом, Box b1 = new Box (5); означает, что мы создаем переменную длиной 5 или значением 5? Это то же самое, что сказать b1 = 5? – Programmer345

2

Когда Box[ ] ba = go (b1, new Bo(6)); запускается, go инстанцирует ba со следующим массивом: [b2,b1], где b2 имеет размер 6 и b1 имеет размер 4. Для того, чтобы быть ясно, go устанавливает размер b1 от 5 до 4. Когда b1, передается в go, он передается ссылкой, что означает, что любые изменения в b1 внутри go также внесены в объект b1, который был создан в первой строке main.

Затем следующий код запускается:

ba[0] = b1; 

Здесь вы устанавливаете b2 внутри массива (так как ba[0] относится к b2) равна b1. Теперь как b2, так и b1 относятся к коробке с размером 4.

P.S. Fun факт, объекты никогда напрямую равен данные; объекты - это только адреса, которые соответствуют или , ссылаются на на данные, записанные в другом месте в стеке. Итак, технически, когда запущено ba[0] = b1;, b2 просто ссылается на на те же данные, что и b1.

2

В Java это всегда проход по значению

Примитивы всегда проход по значению

объекты передаются их ссылки и эти ссылки также передаются по значению.

public static void main(String[] args) { 
     Box b1 = new Box(5); //Line1 
     Box[] ba = go(b1, new Box(6)); //Line2 
     ba[0] = b1; //Line3 
     for (Box b : ba) 
      System.out.print(b.size + " "); 
    } 

Ответ (4 4), потому что,

  • В LINE1 вы инициализацией size из Box 5 внутри конструктора.
  • В строке 2 вы отправляете два объекта в качестве аргументов в метод go(). size объекта, указанного на b1 теперь 5 и new Box(6); объект имеет размер 6. Внутри метода, вы меняете значение параметра 1 от 5 до 4. И, наконец, вы вернулись массив ma с b2 в качестве первого элемента и b1 в качестве второго элемента. b2 имеет значение 6 и b1 имеет 4.
  • Теперь в строке 3 вы снова меняете значение первого элемента внутри массива.Вы заменили первый элемент внутри массива b2, который имеет значение 6 с b1 которого значение теперь 4.
0

В Java все примитивные типы передаются по значению, а остальные, как объекты или массивы передаются по Справка. Это означает, что при вызове метода

go(Box b1, Box b2) 

он изменяет значение b1.size везде, поскольку он устанавливает b1.size = 4, так что результат A: 4 4

+0

«Объекты или массивы передаются по ссылке, и эти ссылки передается по значению ". Это было бы правильнее ИМО. – Prudhvi

+0

Да, вы правы. То, что я хотел сказать, состоит в том, что все изменения объекта отражаются во всей программе. – Chris

Смежные вопросы