Типы данных-классы

332
4
Есть такой вопрос:
Заметил, что String - тип данных, но в тоже время класс! И в отличии от моих классов, объектов к которым нужно создавать через ключевое слово new, после чего вписывать конструктор, объект к классу String создается без инструкции new и указателя на конструктор.
Если кто знает, как добиться такого результата, подкажите, приведите пример, если не трудно, заранее спс.
 
72
0
примеры...
Код:
float f = 1.0f;
double d = 1.0d;
int i = 1;

Без new как бы нельзя создавать объекты класса, но если очень хочется, то можно спрятать, сделав статик импорт метода, который будет за тебя создавать объект, но ни к чему хорошему это не приведёт.
Чем так не понравился new?
 
1,087
2
Да, извини, типы данных. Я лично не знаю можно ли, нет, не пробовал никогда
 
72
0
Больше вопрос: как это должны выглядеть?

Сделать так
Код:
List<Integer> l = List(10).add(1).add(2);
можно (импорт статик). Но зачем?
 
1,137
5
3
Можно сделать так:
Block block="block";
Потребуется писать что-то для компилятора, дабы превратить
Block block=new Block("block");
Всего-лишь синтаксический сахар
 
1,087
2
Вообще даже если он сделает плагин для компилятора, то протестить не сможет так легко в IDE т.к. не пустит, ибо для иде это синтаксическая ошибка.
 
332
4
Ну мне просто для интереса, неужели класс String имеет свой компилятор, который превращает String s = new String("java"); в String s = "java";
Как вообще это работает? Дело не в том, что мне не понравился new, а просто любопытство, ведь класс String тоже не волшебный, и мне стало интересно
[merge_posts_bbcode]Добавлено: 01.02.2016 19:01:11[/merge_posts_bbcode]

Другое дело int (, char, float, double, и т. д), это не классы, а встроенные типы данных, но String же класс
 
183
1
4
При использовании литерала " сначала происходит поиск строки в heap, если не найдена, то создается новая и помещается в пул объектов, если найдена, то возвращается строка из пула. Если же используется new String("...") то сначала инициализируется строка в кавычках, так, как описано выше, но из-за того что используется оператор new у нас все равно создается новая строка. И из-за этого же происходит вот такое. 

Код:
 String s = "abc";
 String s1 = "abc";
 String str = new String("abc");
 String str1 = new String("abc");

 System.out.println(s == s1); //true т.к. это один и тот же объект взятый из пула объектов
 System.out.println(s.equals(s1)); //true т.к. значение строк совпадает
 System.out.println(str == str1); //false т.к. это два разных объекта созданных с помощью оператора new
 System.out.println(str.equals(str1)); //true т.к. не смотря на разные ссылки их значение совпадает

В результате использование new String выходит дороже.
 
2,955
12
Строковые константы грузятся в стек инструкцией LDC (как и некоторые примитивы), а при создании новых объектов строк юзается обычный NEW. Вот и вся магия.
 
1,990
18
105
Ну вы все молодцы, но самый годный ответ всё равно у RedEnergy.
Темку закрыть можно?
 
332
4
Спс всем! полезное инфо, закрывайте)
 
Сверху