Добрый день. Столкнулся с такой ситуацией.
Сначала посмотрел , выдаст этот код:
class anyexperiment{
public static void main(String[] args) {
// StringBuffer a = new StringBuffer("One");
// StringBuffer b = new StringBuffer("Two");
String a = "One";
String b = "Two";
swap(a,b);
System.out.println("a is " + a + "\nb is " + b);
}
static void swap(String a, String b){
a = a + " more";
b = a;
}
}
вывод:
a is One
b is Two
Но! Если его чуть чуть поменять , то получится совсем другой результат:
class anyexperiment{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("One");
StringBuffer b = new StringBuffer("Two");
// String a = "One";
// String b = "Two";
swap(a,b);
System.out.println("a is " + a + "\nb is " + b);
}
static void swap(StringBuffer a, StringBuffer b){
a.append(" more");
b = a;
}
}
вывод:
a is One more
b is Two
Подскажите в чем прикол?
Программа выведет строку «John:Paul» дважды.
Но все же не совсем ясно как трактовать строчку
a = a + «more»;
Как я понимаю создается новый объект — строка, который будет доступен только внутри метода.
Ссылка a теперь указывает на другой объект. Но как понимает компилятор по какой ссылке выводить значение a?
И еще вопрос. Если все то же самое сделать для Integer( в методе например увеличивать на 1), то мы тоже будем получать исходные значения?
это одни строки.
а вот это:
другие. в принлтнах ты выводишь именно те строки которые в маине. а выбираются они по принципу самые близкие.
Вот инфа по куче из спеки по JVM, это по фреймам, а это по стеку.
Переменные в языке Java делятся на два типа: простые и ссылочные. Ссылка указывает на область памяти, где размещаются данные объекта. Всем ссылочным переменным можно присвоить литерал null. Аналогией объявлению и инициализации переменной может служить собака с поводком.
Отличие переменных примитивного типа от ссылочного
Первым отличием является то, что переменные простого типа хранят фактические значения, а ссылочные переменные хранят адреса объектов, на которые они ссылаются.
Второе отличие состоит в том, как происходит передача данных при вызове метода. При передаче аргументов методам происходит копирование по значению. Т.е. в области видимости метода будет создана новая переменная. И если эта переменная простого типа, то будет скопировано фактическое значение, если она ссылочного типа, то будет скопирована ссылка. Т.е. при вызове метода создается фрейм, который хранит переданные данные в локальных переменных, а сам фрейм помещается в стек.
А еще лучше всего зайти на Кстати классыне рисунки. Насклько я помню это из книги по подготовке к сертификации по яве хотя могу и ошибатся. Удачи в сдаче
Картинки из книги "OCA Java SE 7 Programmer I Certification Guide" автора Mala Gupta.
Любой создаваемый объект хранится в куче, а ссылок на него может быть сколь угодно много. Соответственно, если состояние объекта можно изменить, то сделать это можно воспользовавшись любой из ссылок.