2013-04-30 3 views
0

Я довольно смущен тем, как Object работает на Java, так как я сталкиваюсь с этой проблемой.Как работает String в Object Object в Java

Скажем, у меня есть функция под названием checkDateValue (код выглядит следующим образом)

private boolean checkDateValue(Date d1, String msg) { 
    if (d1 == null) { 
     msg = "d1 is null!"; 
     return false; 
    } 
    return true; 
} 

Вот место, которое я называю эту функцию:

String msg = null; 
Date d1 = null; 
if (!checkDateValue(d1, msg)) { 
    system.println(msg); //msg is still null..... 
         //what I need is the message generated in the function 
} 

Насколько я знаю, если я поставлю настроенный объект (например

myObj { private String msg;} 

) я к функции, и мы меняем значение msg внутри функции, когда мы выходим из функции, смена msg сохраняется. Тем не менее, я думаю, что String также рассматривается как объект в java. Почему изменение не сохраняется?

+0

Возможный дубликат [Передача строки по ссылке в Java?] (Http://stackoverflow.com/questions/1270760/passing-a-string-by-reference-in- java) – delnan

+0

@delnan: Я думаю, что вы правы. У меня есть тот же вопрос, что и в этом посте ..... – user2296188

+0

Спасибо вам за помощь всем вам, ребята ~ !!! Думаю, теперь я понял. Я признаю, что навык поиска по ключевым словам довольно плохо ...... – user2296188

ответ

1

String is special, является immutable и diffrent от обычного объекта. Java String предназначен для взаимодействия между примитивным и классом.

String передается по значению, но, к сожалению, каждое изменение в String делает новое значение, поэтому ваша старая ссылка имеет старое значение.

Я думаю, что это хорошее объяснение: https://stackoverflow.com/a/1270782/516167

+4

Любой может создать непреложный класс. Строка особенная в некоторых отношениях (например, есть литералы), но не в этом случае. Это просто еще один неизменный класс и ссылочный тип, как и любой другой класс. И, как я уже говорил, изменчивость не влияет на то, что описывает OP. – delnan

0

msg = "d1 is null!"; и msg=null - это два разных объекта String. String s неизменяемы в Java. Ссылка передается по значению, то есть копия ссылки передается. и поскольку String является неизменным объектом, назначение внутри метода создает новый объект String, на который указывает теперь копия ссылки. Исходная ссылка все еще указывает на нуль String. Ваш вызов метода такой же, как:

Object obj = null; // obj points to nowhere 
foo(obj); // passed the reference values to method argument 
void foo(Object o) 
{ 
    o = new Object(); // o points to new Object, but obj still points to nowhere 
} 
+4

Mutability не имеет к этому никакого отношения. – delnan

+2

@delnan - Если 'String' были mutable, тогда OP мог бы пройти пустую строку (вместо« null »), и при необходимости метод заполнил непустое значение. –

+1

@ delnan - Правда? Можете ли вы придумать какие-либо последствия, если бы они были изменчивыми? – NINCOMPOOP

0

В Java, вы не можете передать обратно значение для вызова кода, присвоив параметру метода. Вы правы, что вы можете изменить внутреннюю структуру любого параметра, и это изменение будет видно в вызывающем коде. Однако присвоение параметру не то же самое, что изменение внутренней структуры. Кроме того, String является неизменным — после его создания его внутренняя структура не может быть изменена.

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

private boolean checkDateValue(Date d1, String[] msg) { 
    if (d1 == null) { 
     msg[0] = "d1 is null!"; 
     return false; 
    } 
    return true; 
} 

Затем вызовите его следующим образом:

String[] msg = new String[1]; 
Date d1 = null; 
if (!checkDateValue(d1, msg)) { 
    system.println(msg[0]); 
} 
+2

Под «трюком» вы имеете в виду уродливый хак, который вам следует избегать, как чума. –

+0

@ TomHawtin-tackline - Не совсем. Этот «трюк» используется в основных библиотеках Java. Что такое чума? –

+0

Существует разница между передачей массива для извлечения ряда значений и передачей массива singleton только для эмулирования pass-by-reference. – delnan

2

Java не имеет "out" аргументы функции; это копии ссылок. Несмотря на то, что вы изменяете функцию msg, она не влияет на переменную вызывающего абонента.

0

Это связано с тем, что

Java передает объекты как ссылки, передаваемые по значению.

Вы не можете изменить ссылочный аргумент, чтобы указать на что-то еще. You может изменить состояние объекта.

Вы можете прочитать больше here

0
if (!checkDateValue(d1, msg)) 

{ 
    system.println(msg); 
} 

при вызове методы checkDateValue ссылки String msg = null; Date d1 = null; методы передается, попадающий по значению. Когда метод будет выполнен, тогда в msg переменная в checkDateValue будет ссылаться на «d1 is null!». Здесь msg переменная в вызове остается такой же