Форум

Data.BG Форуми: Java методите pass by reference or pass by value - Data.BG Форуми

Прехвърляне към съдържание

Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

Java методите pass by reference or pass by value

#1
Потребителят е неактивен   gringocekcu 

  • Група: Потребители
  • Мнения: 387
  • Регистриран: 03-February 08
  • Репутация: 5
Попринцип всичко го пише в нета и гугъл може да помогне но въпреки това този въпрос за мен остава малко сложен. Почти навсякъде пише "java methods pass by value" и да, каквито и да е тестове правя наистина това се оказва правилно. Например в джава не можеш да напишеш swap метод. Обаче когато се намесят колекциите (ArrayList, LinkedList, Queue ...) нещата започват да не са точно така. Когато колекция се пасне на метод то тя се пасва все едно е пасната като референция (вътре в метода може да се правят промени и тези промени се запазват за обекта и извън метода). Е как така нали всичко беше pass by value. Какво да говоря в джава съществува метод
Collections.reverse(list);
който работи. Та въпроса ми е всичко в джава методите ли се пасва като стойност и ако да защо се случва това с колекциите? Само колекциите ли се пасват като референция или има и други класове?
0

#2
Потребителят е неактивен   gringocekcu 

  • Група: Потребители
  • Мнения: 387
  • Регистриран: 03-February 08
  • Репутация: 5
Извинявам се след по дълбоко търсене открих точния отговор на въпросите ми.
0

#3
Потребителят е неактивен   debelin 

  • Група: Потребители
  • Мнения: 2951
  • Регистриран: 28-July 06
  • Репутация: 16
  • Град:В сърцето на всяка филия
Обектите се предават по референция, примитивите по стойност.
http://filoproject.eu/ - top level protection for your Blackberry device!
0

#4
Потребителят е неактивен   stormreaver 

  • Група: Потребители
  • Мнения: 2419
  • Регистриран: 03-May 06
  • Репутация: 191
  • Пол:Мъж
  • Град:BG
Всичко във java е pass-by-value.

Референциите към обекти също се предават по стойност:

Foo foo; // декларираме референция(все едно пойнтер, указател) foo от тип Foo(типа може да е клас или абстрактен клас или интерфейс или enum или масив)
foo = new Foo(); // референцията сочи към адреса на новосъздаден обект от тип Foo(типа може да е само неабстрактен клас, все пак се инстанцира)

someMethod(foo); // предаваме референцията foo по стойност

someMethod(Foo fooarg) // референцията fooarg от тип Foo копира стойността на предадената референция foo, т.е. сочи към същия обект, все едно Foo fooarg = foo;
{
     fooarg.modifySomeValue("asdasda"); // модифицираме някакво поле на обекта създаден по-горе
     fooarg = new Foo(); // тук вече "връзката се прекъсва", референцията fooarg вече сочи към нов различен обект, и каквото и да правим в тоя метод повече не можем да афектираме обекта създаден по-горе
}

Та в метод можем само да модифицираме обекта сочен от предадената референция, но не можем да променяме оригиналната референция да сочи към други обекти.

Методите не могат да променят стойността на предадените променливи защото получават тяхно копие, но стойността на референциите е адрес на обект, самият обект може да бъде променян, защото метода има копие на адреса му, т.е. знае къде е и може да го достъпва.

Мнението беше редактирано от stormreaver: 11.11.15 - 18:59

0

Споделете тази тема чрез:


Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

1 потребители четат тази тема
0 регистрирани потребители, 1 гости и 0 анонимни потребители


Data.BG e форум за дискусии. Data.BG не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Data.BG.

Close  Member Login