Является ли Java 100% объектно-ориентированным?

Java имеет примитивные типы данных, которые не происходят из объекта, подобного Ruby. Итак, можем ли мы рассматривать Java как 100% объектно-ориентированный язык? Другой вопрос: почему Java-код примитивных данных не является объектом объекта?

Ответ 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 наиболее популярные полностью объектно-ориентированные языки.