В языке 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
Я не знать, но я предполагаю, что строковые классы особенные, и компилятор обрабатывает их по-особенному.