Java имеет примитивные типы данных, которые не происходят из объекта, подобного Ruby. Итак, можем ли мы рассматривать Java как 100% объектно-ориентированный язык? Другой вопрос: почему Java-код примитивных данных не является объектом объекта?
Является ли Java 100% объектно-ориентированным?
Ответ 1
Когда Java впервые появилась (версии 1.x), JVM была действительно, очень медленной. Не внедряя примитивы в качестве объектов первого класса, это был компромисс, который они использовали для достижения скоростных целей, хотя я думаю, что в конечном итоге это было очень плохое решение.
"Объектно-ориентированный" также означает множество вещей для многих людей. Вы можете использовать OO (С++, Java, С#) на основе классов, или вы можете использовать OO (Javascript, Lua) на основе прототипа.
100% объектно-ориентированный не означает многого, действительно. У Ruby также есть проблемы, с которыми вы столкнетесь время от времени.
Что меня беспокоит в Java, так это то, что он не обеспечивает средств для эффективного абстрагирования идей, расширения языка, где он имеет проблемы. И всякий раз, когда этот вопрос поднимался (см. Гай Стил "Растущий язык" ), "о но, а как насчет Джо Шеппака?" аргумент. Даже если вы разрабатываете язык, который не позволяет стрелять себе в ногу, есть разница между случайной сложностью и реальной сложностью (см. No Silver Bullet) и посредственным разработчики всегда найдут творческие способы съемки самих себя.
Например, Perl 5 не является объектно-ориентированным, но он достаточно расширяем, что позволяет Moose, объектную систему, которая позволяет очень передовые методы борьбы со сложностью ОО. И синтаксический сахар не проблема.
Ответ 2
Нет, поскольку у него есть типы данных, которые не являются объектами (например, int
и byte
). Я считаю, что Smalltalk действительно объектно-ориентированный, но у меня есть лишь небольшой опыт работы с этим языком (около двух месяцев, который стоит около пяти лет назад).
Я также слышал заявления от толпы Ruby, но у меня нет опыта работы с этим языком.
Это, конечно, использование определения "по-настоящему OO" означает, что у него есть только объекты и другие типы. Другие могут не согласиться с этим определением.
Похоже, после небольшого исследования Python (я понятия не имел о различии имени/объекта, несмотря на то, что он был закодирован в течение года или около того), я думаю, более глупо, что это действительно действительно OO.
Следующий код работает нормально:
#!/usr/bin/python
i = 7
print id(i)
print type(i)
print i.__str__()
Вывод:
6701648
<type 'int'>
7
поэтому даже базовые целые числа здесь являются объектами.
Ответ 3
Чтобы получить истинную 100% -ную OO, подумайте, например, Smalltalk, где все является объектом, включая сам компилятор, и даже выражения if
: ifTrue:
- это сообщение, отправленное на логическое значение с блоком параметров кода.
Ответ 4
Java не является 100% OO. Java может продвигаться к 99% OO (подумайте об авто-боксе, Scala). Я бы сказал, что Java теперь составляет 87% OO.
Почему Java не создает примитивные данные типы как объект способ?
В 90-х годах были причины производительности, и в то же время Java остается обратно совместимой. Поэтому они не могут их вынуть.
Ответ 5
Проблема в том, что объектно-ориентированный не очень хорошо определен и может означать много вещей. Эта статья объясняет проблему более подробно: http://www.paulgraham.com/reesoo.html
Кроме того, Алан Кей (изобретатель Smalltalk и автор (?) термина "объектно-ориентированный" ) классно сказал, что он не имел в виду С++, когда думал о ООП. Поэтому я думаю, что это может относиться и к Java.
Язык, являющийся полностью OO (независимо от того, что это означает), желателен, потому что это означает лучшую ортогональность, что хорошо. Но учитывая, что Java в любом случае не очень ортогональна, небольшая часть его незавершенности OO, вероятно, практически не имеет значения на практике.
Ответ 6
Нет, Java нет, поскольку он имеет примитивные типы данных, которые отличаются от объектов (у них нет методов, переменных экземпляра и т.д.). Ruby, с другой стороны, полностью OOP. Все это объект. Я могу это сделать:
1.class
И он вернет класс 1 (Fixnum, который в основном является числом). Вы не можете сделать это на Java.
Ответ 7
Java, по той причине, что вы упомянули, с примитивами, не делает ее чисто объектно-ориентированным языком программирования. Тем не менее, обеспечение того, чтобы каждая программа была классом, делает ее очень ориентированной на объектно-ориентированное программирование.
Ruby, как вы упомянули, и оказался первым языком, который пришел мне в голову, это язык, который не имеет примитивов, а все значения - объекты. Это, безусловно, делает его более объектно-ориентированным, чем Java. С другой стороны, насколько я знаю, нет требования, чтобы часть кода была связана с классом, как в случае с Java.
Тем не менее, у Java есть объекты, которые обтекают примитивы, такие как Integer
, Boolean
, Character
и т.д. Причиной наличия примитивов, вероятно, является причина, указанная в ответе Питера, когда Java появилась в середине 90-х годов, память на системах в основном была в двузначных мегабайтах, поэтому, имея каждое значение, объект был большим накладным,
(Большой, конечно, относительный.Я не могу вспомнить точные числа, но накладные расходы на объект составляли около 50-100 байт памяти. Определенно больше, чем минимум нескольких байтов, необходимых для примитивных значений)
Сегодня со многими настольными компьютерами с несколькими гигабайтами памяти накладные расходы на объекты меньше.
Ответ 8
"Почему Java не создает примитивные типы данных как объект?"
В дни разработчиков Sun, довольно много лет назад, я помню, как Джеймс Гослинг отвечал на это. Он сказал, что им понравилось полностью отвлечься от примитивов - оставить только стандартные объекты, но потом не хватило времени и решила отправить с тем, что у них было. Очень грустно.
Ответ 9
Итак, мы можем рассматривать java как 100% -ный объект ориентированный язык?
Нет.
Другой вопрос: почему Java не дизайн примитивных типов данных как объект способ?
В основном по соображениям производительности, возможно, также более знакомы людям, пришедшим с С++.
Ответ 10
Одна из причин, по которой Java не может явно отказаться от не-объектных примитивов (int
и т.д.), заключается в том, что она не поддерживает собственные члены данных. Представьте себе:
class int extends object
{
// need some data member here. but what type?
public native int();
public native int plus(int x);
// several more non-mutating methods
};
Во-вторых, мы знаем, что Java поддерживает внутренние данные для каждого объекта (блокировки и т.д.). Возможно, мы могли бы определить class int
без каких-либо элементов данных, но с помощью собственных методов, которые управляют этими внутренними данными.
Оставшиеся проблемы: константы - но они могут обрабатываться аналогично строкам. Операторы - это просто синтаксический сахар и +
и будут отображаться во время компиляции методом plus
, хотя нам нужно быть осторожным, чтобы int.plus(float)
возвращал float
, как и float.plus(int)
, и так далее.
В конечном счете, я считаю, что оправдание для примитивов является эффективностью: статический анализ, необходимый для определения того, что объект int
может рассматриваться только как целочисленное значение JVM, может считаться слишком большой проблемой при разработке языка.
Ответ 11
Я бы сказал, что языки с полным OO - это те, которые имеют свои элементы (классы, методы), доступные как объекты для работы.
Из этого POV Java не является полностью языком OOP, а JavaScript (независимо от того, имеет ли он примитивы).
Ответ 12
Согласно Концепции в книге Языки программирования, есть что-то, что называется тестом Ingalls, предложенным Дэн Ингаллс - лидер группы Smalltalk. То есть:
Можете ли вы определить новый тип целого числа, поместите ваши новые целые числа в прямоугольники (которые уже являются частью окна системы), попросите систему очернить прямоугольник, и все работает?
И опять же по книге Smalltalk проходит этот тест, но С++ и Java этого не делают. К сожалению, книга недоступна в Интернете, но вот некоторые поддерживающие slides (слайд 33 отвечает на ваш вопрос).
Ответ 13
Нет. Например, Javascript.
Что бы записывали эти целые и длинные и булевы классы? Как вы могли бы написать ArrayList или HashMap без примитивных массивов?
Ответ 14
Это один из тех вопросов, который действительно имеет значение только в академическом смысле. Ruby оптимизирован для обработки ints, longs и т.д. В качестве примитивов, когда это возможно. Java просто сделала это явным. Если у Java были примитивы, то были бы классы IntPrimitive, LongPrimitive и т.д. (По каким-либо именам). который, скорее всего, будет окончательным без специальных методов (например, IntPrimitive.factorial). Это будет означать, что для большинства целей они будут примитивными.
Ответ 15
Java явно не 100% OO. Вы можете легко запрограммировать его в процедурном стиле. Большинство людей это делает. Это правда, что библиотеки и контейнеры, как правило, не так прощают эту парадигму.
Ответ 16
Java не полностью объектно ориентирован. Я бы рассмотрел Smalltalk и Eiffel наиболее популярные полностью объектно-ориентированные языки.