Что-то как следующее:
касательно примера:
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"
}
Нет, в Java нет чего-то вроде ключевых слов C # ref
и out
для передачи по ссылке.
В Java можно передавать только по значению. Даже ссылки передаются по значению. См. Страницу Джона Скита о передаче параметра в Java для получения более подробной информации.
Чтобы сделать что-то похожее на ref
или out
, вам нужно будет заключить ваши параметры в другой объект и передать ссылку на этот объект в качестве параметра.
Прямой ответ: Нет
Но вы можете смоделировать ссылку с помощью оберток .
И сделайте следующее:
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
Java передает параметры по значению и не имеет механизма, разрешающего передачу по ссылке. Это означает, что всякий раз, когда передается параметр, его значение копируется в кадр стека, обрабатывающий вызов.
Термин значение , как я его здесь использую, требует небольшого пояснения. В Java есть два типа переменных - примитивы и объекты. Значение примитива - это сам примитив, а значение объекта - его ссылка (а не состояние объекта, на который ссылаются). Следовательно, любое изменение значения внутри метода изменит только копию значения в стеке и не будет замечено вызывающей стороной. Например, нет никакого способа реализовать настоящий метод подкачки, который получает две ссылки и меняет местами их (а не их содержимое!).