powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / почему так? про передачу ссылочного типа
22 сообщений из 22, страница 1 из 1
почему так? про передачу ссылочного типа
    #34432088
I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
I
Гость
почему следующая программа выводит тут1: 10 тут2: 20, не 10 10, объясните плиз, почему ссылки с одним именем действуют как разные

class ValHold{
public int i = 10;
}

public class A{
public static void main(String argv[]){
A o = new A();
o.amethod();
}

public void amethod(){
ValHold v = new ValHold();
v.i = 30;
another(v);
System.out.println("тут2: " + v.i);
}//End of amethod

public void another(ValHold v){
v.i = 20;
v = new ValHold();
System.out.println("тут1: " + v.i);
}//End of another
}
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34432172
Дуремар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I
class ValHold{
public int i = 10;
}

public class A{
public static void main(String argv[]){
A o = new A();
o.amethod();
}

public void amethod(){
ValHold v = new ValHold(); //Создаешь новый экземпляр ValHold (назовем его ValHold_1) и присваеваешь ссылку на него переменной v
v.i = 30; // ValHold_1.i = 30
another(v); //Передаешь ссылку на ValHold_1 в another
System.out.println("тут2: " + v.i);//Переменная v ссылается на ValHold_1, т.е. печатаем 20
}//End of amethod

public void another(ValHold v){ //Получили ссылку на ValHold_1 и присвоили ее переменной v
v.i = 20; // ValHold_1.i = 20
v = new ValHold();//Создаешь новый экземпляр ValHold (назовем его ValHold_2) и присвоили ссылку на него переменной v. ValHold_2.i = 10 (выставляется в конструкторе)
System.out.println("тут1: " + v.i);//Переменная v ссылается на ValHold_2, т.е. печатаем 10
}//End of another
}
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34432177
max_from_sumy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект ValHold передается по ссылке а не по значению, т.е. меняя значение ссылки в методе another(ValHold v) (...v = new ValHold();...) вы не меняеете сам обьект созданный в методе amethod()
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34432180
Дуремар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если этих объяснений недостаточно то почитай какие-нибудь книги по яве - особенно области видимости переменных.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34432211
I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
I
Гость
спасибо всем теперь буду знать
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34433009
Вообще то, в Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   class  Test {

     public   static   void  main(String[] args) {
        String a = "a";
        String b = "b";

        swap(a, b);
        System.out.println(a);
        System.out.println(b);
    }

     private   static   void  swap(String a, String b) {
        String temp = a;
        a = b;
        b = temp;
    }
}

Даже когда вы передаете в метод ссылочный объект, он передаеться по значению. т.е. создается копия и она передаеться. И как вы эту копию не изменяйте это не будет иметь никаго эффекта, единственное что вы можете сделать это изменить состояние объекта через эту ссылку.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34433061
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
параметры передаються по значениВообще то, в Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению.

...

Даже когда вы передаете в метод ссылочный объект, он передаеться по значению. т.е. создается копия и она передаеться. И как вы эту копию не изменяйте это не будет иметь никаго эффекта, единственное что вы можете сделать это изменить состояние объекта через эту ссылку.

чево?

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

твои объяснения могут сбить с толку, человек может подумать, что копируется объект, а не ссылка

я бы так сказал

Даже когда вы передаете в метод ссылочный объект, он передается по значению (передается значение ссылки) . т.е. создается копия ссылки и она передаеться. И как вы эту копию ссылки не изменяйте это не будет иметь никаго эффекта, единственное что вы можете сделать это изменить состояние объекта через эту ссылку.

а так бы я вообще не говорил про объектные параметры. только про примитивные

авторВообще то, в Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34433245
аувв
Даже когда вы передаете в метод ссылочный объект, он передается по значению (передается значение ссылки) . т.е. создается копия ссылки и она передаеться. И как вы эту копию ссылки не изменяйте это не будет иметь никаго эффекта, единственное что вы можете сделать это изменить состояние объекта через эту ссылку.


да, думаю что так стало понятней.

А примером я хотел показать, что передаються копии ссылок и их "перестановка" ничего не дает.

Утверждение что в java параметры передаються по значению, по моему вполне нормальное. В языках программирования передача параметров есть: по ссылке, по значению. Например в C++ пример есть передача параметров по ссылке, но в java ведь ее нет.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34433299
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
параметры передаються по значениВообще то, в Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению.чиво?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
List list =  new  ArrayList();

System.out.println(list.size());

doit(list);

System.out.println(list.size());

 void  doit(List list) {
  list.add("item");
}

если параметр передается по значению, почему меняется его размер?
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34433302
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметры передаються по значениУтверждение что в java параметры передаються по значению, по моему вполне нормальное.да нискока ненормальное.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434377
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
List list =  new  ArrayList();

System.out.println(list.size());

doit(list);

System.out.println(list.size());

 void  doit(List list) {
  list.add("item");
}

Сообственно что тут происходит?
1. Когда передаеться параметр, то создается новая объектная ссылка на тот же самый ArrrayList и теперь у вас две ссылки которые ссылаються на один объект.
2. Передаеться эта новая ссылка.
3. Вы через эту ссылку изменяете состояние объека, а не саму ссылку.

а вы попробуйте поменять саму ссылку. Какой будет результат?

Например

Код: plaintext
1.
2.
3.
4.
5.
6.
     private   static   void  doit(List list) {
        list =  new  ArrayList(); // что нам мешает сделать так?
        list.add("1");
        list.add("2");
        list.add("3");
    }
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434465
James Gosling
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The Java programming language does not pass objects by reference; it passes object references by value. Because two copies of the same reference refer to the same actual object, changes made through one reference variable are visible through the other. There is exactly one parameter passing mode -- pass by value -- and that helps keep things simple.

-- James Gosling, et al., The Java Programming Language, 4th Edition
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434541
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
James GoslingThe Java programming language does not pass objects by reference; it passes object references by value.вот и товарищь гослинг говорит: передает ссылки на объекты по значению. а не просто "объекты по значению".

правда сакральную разницу между передачей объектов по ссылке и передачей значения ссылки на объект я не понимаю.... ну и ладно. это наверно че-то там в си или в бейсике необычное.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434562
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что произошло?а вы попробуйте поменять саму ссылку. Какой будет результат?
Код: plaintext
1.
2.
3.
     private   static   void  doit(List list) {
        list =  new  ArrayList(); // что нам мешает сделать так?
    }
любите вы локальные переменные менять! :)
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434605
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™если параметр передается по значению, почему меняется его размер?

Потому что изменяется размер объекта на который указывает параметр List list метода. Все абсолютно правильно - в Java параметры передаются только по значению. Ваша переменная List list = new ArrayList(); всегда будет указавать на созданные объект new ArrayList сколько вы не будете вызывать метод наподобие следущего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 import  java.util.List;

 public   class  TestValueParams {

	/**
	 * @param args
	 */
	@SuppressWarnings("unchecked")
	 public   static   void  main(String[] args) {
		List list =  new  ArrayList();
		list.add( new  Integer( 0 ));
		System.out.println(list);
		change(list);
		System.out.println(list);
	}
	
	 static   void  change(List list){
		list =  new  ArrayList();
		list.add( new  Integer( 1 ));
		list.add( new  Integer( 2 ));
		System.out.println("change: " + list.toString());
	}

}

Код: plaintext
1.
2.
[0]
change: [1, 2]
[0]
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434608
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йолки. я понял. госслинг хотел объяснить как попроще, а только людей с толку сбил! он же гений. как эйнштейн наших дней.

отсюда и постоянные вопросы.

а им вответ госслинговское "все просто: все только по значению". забывая добавить, что "значением в случае объектов является ссылка".

не все такие гении, как госслинх. надо чуть больше слов говорить, чтоб проще оказывалось.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434619
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слава богу I (или l, в общем, автор топика) давно ушла вместе с правильным пониманием как все работает, либо читать книжку.

и мозги у ней не свихнуцца, глядя как гуры выпендириваются друг перед другом в этом важном вопросе соверменных веб-технологий
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434846
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, Гослинг пишет не для гениев современности. Гослинг пишет для тех, кого в ВУЗе учили программированию, и кто в ВУЗе учился программированию. Просто в книгах также пишут, что все переменные, которые указывают на объект, на самом деле ссылки на объект.
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434878
Дуремар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во флуда то сколько на пустом месте развели...
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34434916
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvПросто в книгах также пишут, что все переменные, которые указывают на объект, на самом деле ссылки на объект.или можно по-другому сказать. переменные, которые ссылаются на объект, на самом деле указатели на объект.

если еще раз заменить синонимы:

в книгах пишут, что ссылки на объект - на самом деле ссылки на объект.

чтоб совсем сократить повторы, скажем так: в книгах ничего не пишут :))

и в Вузах это преподают тем, кто учится программированию (одновременно и тем, кого учат программированию)



ой не могу, остановите меня!
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34435307
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ауввой не могу, остановите меня!
Санитары, кляп! И смирительную рубашку! :D
...
Рейтинг: 0 / 0
почему так? про передачу ссылочного типа
    #34436293
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже были здесь топики на 100% схожие с этим. И там выяснялось, что путаница происходит из-за следующих фраз :
параметры передаються по значениВообще то, в Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению.
Правильнее сказать так:
авторв Жаве нет передачи параметров по ссылке, параметры всегда передаються по значению ссылки .

Ибо ссылка - это адрес ячейки памяти + то что в этой ячейки записано. А значение ссылки - это только то, что находится в ячейки пямяти.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / почему так? про передачу ссылочного типа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]