2014-01-30 5 views
0

В моем классе программирования мы создаем класс, похожий на класс Java String. Сейчас мы создаем новый объект так:Как работает класс Java String внутри?

MyString string = new MyString("Hello World"); 

Что хорошо и все, но в Java вы можете создать новый объект String, как это:

String string = "Hello World"; 

Есть ли каким-то образом, чтобы эмулировать, что ? Разве это не то, что люди называют неизменяемыми, где вы можете изменить объект после его создания и добавить к объекту?

Редактировать: Видимо, мне нужно вернуться к классу английского языка. «Им» в непреложных средствах «нет» ... К сожалению, я имел в виду изменчивость.

+0

Этот способ инициализации вы не можете сделать для своего собственного класса. –

+8

Нет, это не имеет ничего общего с неизменностью. Это литерал 'String', который обрабатывается компилятором Java. Это часть спецификации языка. Вам нужно будет реализовать свой собственный компилятор, если вы захотите подобного поведения. –

+0

Невозможно добавить эту функцию? –

ответ

3

Быть «неизменным» на самом деле является противоположностью того, что вы описываете; это означает, что объект не может быть изменен после создания или добавлен в.

Несмотря на это, это не имеет ничего общего с неизменностью. Невозможно подражать этой конструкции для ваших собственных классов. Строковые литералы являются частью спецификации голых костей языка. Точно так же, как у нас нет перегрузки оператора в Java (и, таким образом, у нас нет способа заставить интерпретатор компилятора + так, как нам хотелось бы), мы не можем заставить компилятор понять другой набор литералов. Они просто такие, какие они есть.

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

Вы можете прочитать больше о литералах в JLS 3.10 или официальных учебниках Oracle (this one для String s, this one для реальных примитивных типов).

0

В Java строковые литералы являются экземплярами класса String. Итак, во втором примере конверсия не происходит. Это не имеет ничего общего с неизменяемостью (но вы столкнулись с проблемами, если Strings были изменчивыми).

EDIT: Чтобы посмотреть, как работает класс String, ознакомьтесь с его source (OpenJDK).

0

Другой пример

Integer Int = 5; 

ИЛИ

Integer Int = new Integer (5); 

И работает отлично.

Также нижеследующее работает.

Integer Int; 
int i = 5; 
Int = i ; 

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

+0

Это не имеет никакого отношения к перегрузке оператора. Он называется [autoboxing] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html). И он работает между всеми примитивными типами и соответствующими классами-оболочками. – asteri

+0

Это не проблема, я знаю, что оба работают одинаково. –

+0

Спасибо @Jeff. См. Http://www.jguru.com/faq/view.jsp?EID=1299048 «Верно, что Java не разрешает перегрузку оператора. Верно также, что исключение было сделано для String, хотя это не контроль над разработчиками, поскольку это встроенная функция Java ». Поэтому я согласен с тем, что перегрузка оператора здесь не является правильным. Я предполагаю, что преобразование строк или примитив String для обтекания обертки выполняется внутренним образом либо компилятором, либо временем выполнения. Разработчик не может подражать этому поведению. –

Смежные вопросы