public class Program
{
public static void main(String[] args) {
Student a = new Student("Vasya");
Student b = new Student("Kolya");
a.tostring();
b.tostring();
swap(a, b);
a.tostring();
b.tostring();
}
public static void swap(Student a, Student b){
Student c;
c=b;
b=a;
a=c;
}
}
public class Student{
String name;
public Student(String name){
this.name=name;
}
public void tostring(){
System.out.println(this.name);
}
}
Паша Криворучко
9 уровень
Не работает Swap
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Паша Криворучко
21 февраля 2020, 10:12
Но я же передаю ссылку на обьект. Как сделать чтобы работало?
0
Justinian Judge в Mega City One Master
21 февраля 2020, 10:59
В джаве такой свап без дополнительных танцев не провернуть.
Поскольку ссылку на объект ты не передаешь.
Все передается по значению.
Делается КОПИЯ ссылки, которая отправляется в метод, это не С++, ты не можешь указатель передать и потом его там переопределять.
В джаве все передается по значению, для примитивов это будут КОПИИ значений, для ссылочных типов это будет КОПИИ значений - то есть КОПИИ ссылок
То что ты делаешь с КОПИЯМИ ссылок в методе, никак не повлияет на существующие ССЫЛКИ в главном методе.
Вот что могут копии ссылок это менять объект, копия пульта управления к телевизору, это все-равно пульт управления к телевизору. Переключать каналы ты можешь, иметь доступ к самому объекту. Но отвязывать ссылки от переменных во внешнем коде никак.
Почитай:
http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html
+2
Justinian Judge в Mega City One Master
21 февраля 2020, 12:19
Наткнулся случайно еще на один свой старый ответ, тоже самое, но можно код запустить для наглядности:
3000 лет назад Моисей вышел из пещеры со скрижалями, на которых было записано "В джава все передается по значению".
При передаче примитивов, передается значение, например 2, 5.
При передаче в метод swap, изменения не затрагивают оригинальную переменную.
Ссылочные типы тоже передаются по значению, но в качестве значения идет КОПИЯ ссылки. В чем же разница тогда, передача ссылки и передача ссылки по значению?
А все тот же метод swap.
Запускаем код, и видим, что то что мы всредине метода пытались переприсвоить ссылки на объекты, никак не отобразилось на оригинальных переменных в методе main. Потому что в метод swap не пошли сами ссылки на объекты, а пошли ссылки в виде значений. Мы имеем доступ к объекту, можем его изменять, но мы не можем переназначить ссылки которые были в main. Поскольку имеем дело все с той же копией. 0
Ksenia Volkova Java Developer в DXC Master
21 февраля 2020, 10:07
Потому что переменные a и b в методе main и переменные a и b в методе swap - это разные переменные.
Внутри swap у тебя все работает.
(Можешь добавить внутрь swap
a.tostring();
b.tostring();
и посмотреть).
Но на a и b из main это не влияет.
(Кстати, у тебя класс Student должен быть либо статическим внутри Program, либо не публичным).
+1