Ссылка на строку в Java - PullRequest
       1

Ссылка на строку в Java

0 голосов
/ 15 ноября 2011
class test
{
    public static void main(String args[])
    {
        test ob=new test();
        String st=new String("it is a string");

        System.out.println(ob);
    System.out.println(st);
    }
}

в этом коде ob является ссылкой на тестовый класс, а st является ссылкой на строковый класс.во время печати ob он показывает ссылку, но st печатает значение, т.е. "это строка" .. почему?

Ответы [ 10 ]

7 голосов
/ 15 ноября 2011

Поскольку вы не переопределили toString() в своем классе test, поэтому он использует один из Object (родительский класс всех объектов в Java), который просто собирается вывести имя класса и хэш-код.

Джош Блох описывает это в «Эффективной Java»:

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

(см. «Элемент 9: Всегда переопределять toString»)

6 голосов
/ 15 ноября 2011

потому что строковый класс переопределяет метод toString класса Object, который должен печатать то, что передано конструктору.Но тестовый класс этого не делает.

4 голосов
/ 15 ноября 2011

Если вы запустите println для произвольного объекта, он напечатает строковое представление, созданное его методом toString() (определенным в классе Object), который ваш класс не переопределяет,Реализация по умолчанию печатает ссылку (или что-то в этом роде).

1 голос
/ 18 сентября 2012

Вы увидите много ясного на примере:

class test {

    @Override
    public String toString() {
        return "test={no attributes to print}";
    }

    public static void main(String args[]) {
        test ob = new test();
        String st = new String("it is a string");

        System.out.println(ob);
        System.out.println(st);
    }
}

и результат:

test={no attributes to print}
it is a string

BUILD SUCCESSFUL (total time: 3 seconds)
1 голос
/ 15 ноября 2011

String - это специальный класс в Java, где вы можете хранить строки данных.

Каждый класс по умолчанию расширяет java.lang.Object, и вы можете переопределить метод toSring, чтобы показать данные в вашем классе.

Поскольку вы не переопределили toString, он печатает ссылку.

С другой стороны, класс String обеспечивает реализацию toString () { возвращая это; /// который печатает содержимое строки. }

1 голос
/ 15 ноября 2011

Каждый класс Java расширяет класс Object автоматически, даже если вы явно не объявляете его, а класс Object содержит метод toStrong(), который используется для получения String, представляющего экземпляр класса Object.Метод toString() класса Object реализован для отображения ссылки на объект, но это не фактическая ссылка (это просто текст, содержащий информацию о ссылке).

Однако этот метод может бытьпереопределяется его подклассом, и это то, что происходит с классом String.Метод toString() класса String переопределяется для представления содержимого, которое содержит объект String.

Теперь, когда вы используете методы print или println для объекта, он вызываетtoString() метод объекта и выведите эти значения.

В вашем случае класс test не переопределил метод toString(), поэтому он выводит любое значение, которое дает Object.toString().

1 голос
/ 15 ноября 2011

Это происходит потому, что Java обеспечивает поддержку представления строк в виде литералов, а компилятор поддерживает автоматическое преобразование строковых литералов в объекты String;и автоматическое преобразование любого ссылочного типа (то есть любого подкласса класса Object) в печатную строку с использованием метода Object.toString.

В вашем примере, здесь компилятор Java отмечает, что подпись вызовов метода для оператора print - System.out.toString (String arg).Следовательно, он знает, что аргументы должны быть преобразованы в строку.

1 голос
/ 15 ноября 2011

Есть метод toString() в Object классе ..
Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая «представляет собой текст» этого объекта. Результатом должно быть краткое, но информативное представление, которое легко читается человеком. Рекомендуется, чтобы все подклассы переопределяли этот метод.
Таким образом, вы можете переопределить этот метод и сделать то, что вы хотите сделать ... поэтому класс String также переопределить этот метод и вернуть String, а не хэш-код объекта ..

1 голос
/ 15 ноября 2011

Вызов print для объекта Java просто вызывает метод toString () , который наследуется по умолчанию от класса объекта. Так как класс String имеет переопределенное поведение toString () для печати строкового значения, а ваш тестовый класс не имеет такой реализации , отсюда и разница.

1 голос
/ 15 ноября 2011

Ваш test класс не переопределяет toString, но String делает.Реализация Object test создает строку из имени класса и hashCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...