Интересно, как строковые классы в Java возвращают строки

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

Я не знать, но я предполагаю, что строковые классы особенные, и компилятор обрабатывает их по-особенному.

Rudy Velthuis 27.10.2018 07:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы передаете объект методу 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 и образец как это сделать, поскольку вы публикуете, где описывается, зачем это нужно.

dbl 27.10.2018 08:04

String представляет собой неизменяемые последовательности символов фиксированной длины, в то время как StringBuffer представляет собой расширяемые и записываемые последовательности символов. StringBuffer может содержать символы и подстроки, вставленные в середине или добавленные в конец. Он будет автоматически увеличиваться, чтобы освободить место для таких дополнений, и часто в нем заранее выделено больше персонажей, чем действительно необходимо, чтобы оставить место для роста.

StringBuffer(String str): он принимает аргумент String, который устанавливает начальное содержимое объекта StringBuffer и резервирует место для еще 16 символов без перераспределения. Для получения дополнительных сведений просто перейдите по этой ссылке: https://www.tutorialspoint.com/java/lang/java_lang_stringbuffer.htm

Другие вопросы по теме