Java имеет что-то как C# касательно и ключевые слова?

Что-то как следующее:

касательно примера:

void changeString(ref String str) {
    str = "def";
}

void main() {
    String abc = "abc";
    changeString(ref abc);
    System.out.println(abc); //prints "def"
}

пример:

void changeString(out String str) {
    str = "def";
}

void main() {
    String abc;
    changeString(out abc);
    System.out.println(abc); //prints "def"
}
106
задан Yair Kukielka 17 October 2018 в 16:00
поделиться

3 ответа

Нет, в Java нет чего-то вроде ключевых слов C # ref и out для передачи по ссылке.

В Java можно передавать только по значению. Даже ссылки передаются по значению. См. Страницу Джона Скита о передаче параметра в Java для получения более подробной информации.

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

93
ответ дан 24 November 2019 в 03:52
поделиться

Прямой ответ: Нет

Но вы можете смоделировать ссылку с помощью оберток .

И сделайте следующее:

void changeString( _<String> str ) {
    str.s("def");
}

void testRef() {
     _<String> abc = new _<String>("abc");
     changeString( abc );
     out.println( abc ); // prints def
}

Out

void setString( _<String> ref ) {
    str.s( "def" );
}
void testOut(){
    _<String> abc = _<String>();
    setString( abc );
    out.println(abc); // prints def
}

И вообще любой другой тип, например:

_<Integer> one = new <Integer>(1);
addOneTo( one );

out.println( one ); // May print 2
26
ответ дан 24 November 2019 в 03:52
поделиться

Java передает параметры по значению и не имеет механизма, разрешающего передачу по ссылке. Это означает, что всякий раз, когда передается параметр, его значение копируется в кадр стека, обрабатывающий вызов.

Термин значение , как я его здесь использую, требует небольшого пояснения. В Java есть два типа переменных - примитивы и объекты. Значение примитива - это сам примитив, а значение объекта - его ссылка (а не состояние объекта, на который ссылаются). Следовательно, любое изменение значения внутри метода изменит только копию значения в стеке и не будет замечено вызывающей стороной. Например, нет никакого способа реализовать настоящий метод подкачки, который получает две ссылки и меняет местами их (а не их содержимое!).

7
ответ дан 24 November 2019 в 03:52
поделиться