Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2017, 16:12   #1
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию Передача строковой переменной.

Всем привет, такая программа:

Код:
public class JavaApplication6 {
    
    static void doSomething1(String X){
        X = "qw";
    }
    
    static void doSomething2(String Y[]){
        Y[0] = "qw";
    }
    
    public static void main(String[] args) {
        String X = "abcd";
        String[] Y = {"efgh"};
        doSomething1(X);
        doSomething2(Y);
        
        System.out.println(X + " " + Y[0]);
    }
}
Вопрос в том почему выдаёт результат "abcd qw" а не "qw qw" ведь по идее если это doSomething1(X); и это doSomething2(Y); имеют место быть то осуществляется присвоение новых значений переменным так ведь? Почему меняется значение только --> Y, а --> Х нет?
Поясните как работает эта программа почему выдаёт результат "abcd qw"?

Последний раз редактировалось max29; 02.05.2017 в 16:40.
max29 вне форума Ответить с цитированием
Старый 02.05.2017, 17:34   #2
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Вероятно (точно), потому что параметры передаются по значению. Классика.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 02.05.2017, 17:47   #3
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

Поясните плиз.
max29 вне форума Ответить с цитированием
Старый 02.05.2017, 18:05   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Массив тут не причем.

Код:
public class JavaApplication6 {
    
    static void doSomething1(String X){
        X = "qw";
    }
    
    public static void main(String[] args) {
        String X = "abcd";
        doSomething1(X);
        
        System.out.println(X);
    }
}
Вы поменяли значение локальной переменной функции, а не той, что в main.
Можно считать, что в переменной хранится указатель/ссылка (адрес) на строку и в функцию передается копия этого значения адреса. (а может быть даже так и есть)

Вы ж не удивляетесь
Код:
myFunc(42);

В некоторых языках можно передавать переменную по ссылке (ref в C#, & в С++), тогда бы было так, как вы хотели.

ЗЫ имена переменных в Java обычно пишутся с маленькой буквы (camelCase).
http://www.oracle.com/technetwork/ja...oc-136057.html
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.05.2017 в 18:09.
Alex11223 вне форума Ответить с цитированием
Старый 02.05.2017, 18:08   #5
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от max29 Посмотреть сообщение
Поясните плиз.
RTFM, не?
В java все аргументы передаются по значению, так что внутри doSomething1 Вы работаете с копией строки X, которая за пределами метода не существует. Так что внутри метода X == "qw", а снаружи X == "abcd"
Во втором случае передается ссылка на некоторый объект, аналогично, в doSomething2 Вы работаете с копией ссылки, разница в том, что меняется не сама ссылка, а данные, на которые она указывает.

Возможно, в java это какими-нибудь другими терминами наз-ся, я не знаю. Но суть такая.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 02.05.2017, 19:19   #6
max29
Пользователь
 
Аватар для max29
 
Регистрация: 16.04.2016
Сообщений: 41
По умолчанию

Благодарю всех за ответы!(Вроде-бы понятно всё)
max29 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение строковой переменной. Поллукс Общие вопросы Delphi 34 17.10.2015 00:15
Проблема со строковой переменной MisterDie Паскаль, Turbo Pascal, PascalABC.NET 5 27.02.2013 21:43
Занесение содержимого строковой переменной в поток DannerDOS Общие вопросы Delphi 5 06.05.2010 13:28
Как удалить часть строковой переменной Oooleg Microsoft Office Excel 1 21.07.2009 16:20
TMemoryStream присвоить строковой переменной inndim Общие вопросы Delphi 3 06.05.2009 11:36