В языке Java есть несколько классов, связанных со строками, например String и StringBuffer, которые могут быть загружены только с именем объекта.
Это вот так:
public static void main(String[] args) {
StringBuffer msg = new StringBuffer("Hello JAVA");
printMsg(msg);
}
public static void printMsg(StringBuffer msg) {
msg.append("I like JAVA");
System.out.println("printMsg: " + msg);
}
Однако других классов и кастомных классов недостаточно для имени объекта
Поэтому, когда вы загружаете значение, вы должны написать:
public class IntReference {
private int a;
public void setA(int a) {
this.a=a;
}
public int getA() {
return a;
}
public void add(int y) {
a+=y;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
IntReference intref = new IntReference();
int a=10;
intref.setA(a);
System.out.println(intref.getA());
plus(intref);
System.out.println(intref.getA());
}
public static void plus(IntReference intref) {
intref.add(10);
System.out.println(intref.getA());
}
Так как же классы String и StringBuffer получают свои значения только по имени?
С каким механизмом работает?




Когда вы передаете объект методу println класса System.out, вызывается метод toString, объявленный в классе Object. Вот только для того, чтобы System.out.println мог сообразить, что печатать.
Способ определения метода toString в Object не очень полезен - он выводит набор символов, которые обычно относятся к месту в памяти объекта, а не к его содержимому.
Однако некоторые классы, включая StringBuffer, имеют свою собственную версию toString, которая переопределяет реализацию в Object. Поэтому, если вы вызовете System.out.println и передадите ему StringBuffer, вы фактически увидите содержимое буфера, а не символы, которые вы получили бы, если бы была вызвана версия toString из класса Object.
В вашем классе IntReference нет собственного метода toString, поэтому, когда вы передаете объект IntReference в System.out.println, вызывается метод toString из класса Object. Это не очень полезно, поэтому вместо этого вы делаете такие вещи, как System.out.println(intref.getA()).
Кроме того, я предоставлю явный Документация по Object :: toString и образец как это сделать, поскольку вы публикуете, где описывается, зачем это нужно.
String представляет собой неизменяемые последовательности символов фиксированной длины, в то время как StringBuffer представляет собой расширяемые и записываемые последовательности символов.
StringBuffer может содержать символы и подстроки, вставленные в середине или добавленные в конец. Он будет автоматически увеличиваться, чтобы освободить место для таких дополнений, и часто в нем заранее выделено больше персонажей, чем действительно необходимо, чтобы оставить место для роста.
StringBuffer(String str): он принимает аргумент String, который устанавливает начальное содержимое объекта StringBuffer и резервирует место для еще 16 символов без перераспределения.
Для получения дополнительных сведений просто перейдите по этой ссылке: https://www.tutorialspoint.com/java/lang/java_lang_stringbuffer.htm
Я не знать, но я предполагаю, что строковые классы особенные, и компилятор обрабатывает их по-особенному.