2013-08-05 4 views
0

в этом коде
Почему это отпечатки >> 0 8 вместо >> 5 8. Метод doIt() изменяет количество выделенного Person, которое уже выделено, но int x уже выделен и не изменен в doIt(). Может ли кто-нибудь дать мне теоретическое объяснение? Я пытаюсь понять, как это работает. Спасибо.Значения атрибутов объекта изменения Java

class Person{ 
    int number=0; 
} 

class Student extends Person 
{ 
    int studentNumber; 
} 

public class Prog{ 


    public void doIt(int x, Person p) 
    { 
     x=5; 
     p.number=8; 
    } 

    public static void main(String[] args) { 

     Prog p = new Prog(); 
     p.test(); 

    } 

    public void test() 
    { 
     int x=0; 
     Person p = new Person(); 
     doIt(x,p); 
     System.out.println(x); 
     System.out.println(p.number); 
    } 
} 

ответ

3

Java is always pass by value.

Примитивы, такие как int, передаются по значению, поэтому ваш x в test не изменяется; это всегда 0. Только локальная копия x в doIt изменена на 5, но это значение исчезает, когда заканчивается метод doIt.

Есть два x переменные в программе:

  • x в test: инициализируется в 0 и никогда не изменял.
  • x in doIt: Инициализировано до 0, изменено на 5 и не используется.

Ссылка на ваш Person объект передается по значению, но doItделает изменения number в исходном объекте, так что изменения в 8.

Есть два p переменные в программе:

  • p в test: инициализируется новый Person объекта. number инициализируется в 0.
  • p в doIt: это относится к жеPerson объекта в качестве p в test. Поэтому, когда doIt изменяет number на 5, он изменяет только тот объект Person, который у вас есть.
+0

Таким образом, в случае, если x является копией, а p является реальным объектом, поскольку x является примитивным, а Person p не является? –

+0

Закрыть. В 'doIt',' x' является копией 'x' в' test'. 'p' - тоже копия. Но это копия объекта _reference_. Таким образом, обе переменные 'p' в' doIt' и 'test' относятся к одному и только к объекту Person. – rgettman

+0

Отлично! Большое спасибо! Я больше привык к C++, где я могу указать copys, ссылки .. –

0

Примитивные типы данных, такие как целые числа, основаны на значении вместо ссылки на данные. Устанавливая x=0 в методе, это не устанавливает значение x в методе тестирования равным 0, потому что когда x передается в doIt, это просто значение. Поэтому все, что вы делаете в методе, не записывается. Вам нужно будет передать объект, например, Person, чтобы изменения произошли.

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