Действительно ли Java 100% объектно-ориентирован? [закрытый]

Существует логическое свойство ctrlKey , которое вы можете использовать здесь ...

$(document).keypress(function(e) { 
   alert("Ctrl is pressed: " + e.ctrlKey); 
}); 

12
задан Peter Mortensen 19 August 2010 в 16:30
поделиться

16 ответов

Когда Java впервые появилась (версии 1.x), JVM была действительно очень медленной. Отказ от реализации примитивов в качестве первоклассных объектов был компромиссом, на который они пошли из соображений скорости, хотя я думаю, что в конечном итоге это было действительно плохим решением.

«Объектно-ориентированный» также означает многое для многих людей. У вас может быть объектно-ориентированный объект на основе классов (C ++, Java, C #) или объектно-ориентированный объект на основе прототипов (Javascript, Lua).

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

Что беспокоит меня в Java, так это то, что она не предоставляет средств для эффективного абстрактного понимания идей, для расширения языка там, где у нее есть проблемы. И всякий раз, когда поднимался этот вопрос (см. «Выращивание языка» Гая Стила), «о нет, а как насчет Джо Сикпака?» приводится аргумент. Даже если вы создадите язык, который не позволяет выстрелить себе в ногу, есть разница между случайной сложностью и реальной сложностью (см. No Silver Bullet ), и посредственные разработчики всегда найдут творческие способы стрелять в себя.

Например, Perl 5 не объектно-ориентированный, но он достаточно расширяемый, что позволяет использовать Moose , объектную систему, которая позволяет использовать очень продвинутые методы для решения сложных задач объектно-ориентированного программирования. И синтаксический сахар не проблема.

29
ответ дан 2 December 2019 в 02:51
поделиться

Ясно, что Java не является 100% объектно-ориентированной программой. Вы можете легко запрограммировать его в процедурном стиле. Большинство людей так делают. Это правда, что библиотеки и контейнеры, как правило, не столь снисходительны к этой парадигме.

0
ответ дан 2 December 2019 в 02:51
поделиться

Это один из тех вопросов, который действительно имеет значение только в академическом смысле. Ruby оптимизирован для обработки целых, длинных и т. Д. Как примитивов, когда это возможно. Java только что сделала это явным. Если бы в Java примитивы были объектами, были бы классы IntPrimitive, LongPrimitive и т. Д. (Под любым именем). который, скорее всего, будет окончательным без специальных методов (например, без IntPrimitive.factorial). Это означало бы, что для большинства целей они будут примитивами.

0
ответ дан 2 December 2019 в 02:51
поделиться

Нет. Например, Javascript - это.

На чем будут записаны эти классы Integer, Long и Boolean? Как бы вы написали ArrayList или HashMap без примитивных массивов?

0
ответ дан 2 December 2019 в 02:51
поделиться

Одна из причин, по которой 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 поддерживает внутренние данные для каждого объекта (блокировки и т. Д.). Возможно, мы могли бы определить класс int без элементов данных, но с собственными методами, которые манипулируют этими внутренними данными.

Остающиеся проблемы: Константы - но с ними можно справиться аналогично строкам. Операторы - это просто синтаксический сахар и + , и они будут отображены методом plus во время компиляции, хотя мы должны быть осторожны, чтобы int.plus (float) возвращает float , как и float.plus (int) и т. д.

В конечном счете, я думаю, что оправданием примитивов является эффективность:

1
ответ дан 2 December 2019 в 02:51
поделиться

Итак, можем ли мы рассматривать Java как 100% объект ориентированный язык?

Нет.

Другой вопрос: почему java не проектировать примитивные типы данных как объект способ?

В основном из соображений производительности, возможно, чтобы быть более знакомым людям, пришедшим из C ++.

1
ответ дан 2 December 2019 в 02:51
поделиться

Java не является 100% объектно-ориентированным. Java может приближаться к 99% объектно-ориентированному программированию (подумайте об автобоксе, Scala). Я бы сказал, что Java сейчас на 87% объектно ориентирована.

Почему Java не создает примитивные данные типы как объектный способ?

Еще в 90-е были причины для повышения производительности, и в то же время Java остается обратно совместимой. Поэтому они не могут их вытащить.

5
ответ дан 2 December 2019 в 02:51
поделиться

Java, по указанной вами причине, имея примитивы, не делает ее чисто объектно-ориентированным языком программирования. Однако обеспечение того, чтобы каждая программа была классом, делает ее очень ориентированной на объектно-ориентированное программирование.

Ruby, как вы упомянули, оказался первым языком, который пришел мне в голову, - это язык, который не имеют примитивов, и все значения являются объектами. Это, безусловно, делает его более объектно-ориентированным, чем Java. С другой стороны, насколько мне известно, не требуется, чтобы фрагмент кода был связан с классом, как в случае с Java.

Тем не менее, в Java есть объекты, которые обертывают вокруг примитивов, таких как Integer , Boolean , Character и т. д. Причиной наличия примитивов, вероятно, является причина, указанная в ответе Питера - когда в середине 90-х годов была представлена ​​Java, память в системах была в основном в двузначных мегабайтах, поэтому наличие каждого значения как объекта было большими накладными расходами .

(Большой, конечно, относительный. Я не могу вспомнить точные числа, но накладные расходы на объект составляли около 50-100 байт памяти. Определенно больше, чем минимум в несколько байтов, требуемых для примитивных значений)

Сегодня на многих рабочих столах с несколькими гигабайтами памяти накладные расходы на объекты не представляют большой проблемы.

конечно относительное. Я не могу вспомнить точные числа, но накладные расходы на объект составляли около 50–100 байт памяти. Определенно больше, чем минимум в несколько байтов, требуемых для примитивных значений)

Сегодня, когда многие рабочие столы имеют несколько гигабайт памяти, накладные расходы на объекты не представляют большой проблемы.

конечно относительное. Я не могу вспомнить точные числа, но накладные расходы на объект составляли около 50–100 байт памяти. Определенно больше, чем минимум в несколько байтов, требуемых для примитивных значений)

Сегодня, когда многие рабочие столы имеют несколько гигабайт памяти, накладные расходы на объекты не представляют большой проблемы.

3
ответ дан 2 December 2019 в 02:51
поделиться

Чтобы достичь истинного 100% объектно-ориентированного подхода, подумайте, например, о Smalltalk, где все является объектом, включая сам компилятор, и даже операторы if : ifTrue: - это сообщение, отправленное логическому объекту с параметром блока кода.

14
ответ дан 2 December 2019 в 02:51
поделиться

«Почему java не проектирует примитивные типы данных как объектный способ?»

Во времена разработчиков Sun, довольно много лет назад, я помню, как Джеймс Гослинг ответил на это. Он сказал, что они хотели полностью абстрагироваться от примитивов - оставить только стандартные объекты, но затем не хватило времени и они решили поставлять то, что у них было. Очень грустно.

2
ответ дан 2 December 2019 в 02:51
поделиться

Я бы сказал, что полноцветные языки - это такие языки, в которых их элементы (классы, методы) доступны в виде объектов для работы.

Из этого POV, Java не является полностью ООП-языком, а JavaScript является (неважно, имеет ли он примитивы).

1
ответ дан 2 December 2019 в 02:51
поделиться

Java не полностью ориентирован на объект. Я бы рассмотрел SmallTalk и Eiffel самых популярных полностью объектных ориентированных языков.

-1
ответ дан 2 December 2019 в 02:51
поделиться

Нет, Java нет, так как он имеет примитивные типы данных, которые отличаются от объектов (у них нет методов, переменных экземпляров и т. Д.). Рубин, с другой стороны, полностью ООП. Все - это объект. Я могу сделать это:

1.class

, и он вернет класс 1 (FIXNUM, который в основном является числом). Вы не можете сделать это в Java.

5
ответ дан 2 December 2019 в 02:51
поделиться

Проблема в том, что объектно-ориентированная на самом деле не очень хорошо определена и может много значить. Эта статья объясняет проблему более подробно: http://www.paulgraham.com/reesoo.html

Также Алан Кей (изобретатель Smalltalk и автор(?) термина "объектно-ориентированный") известен тем, что не имел в виду Си++, когда думал об ООП. Поэтому я думаю, что это может относиться и к Java.

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

6
ответ дан 2 December 2019 в 02:51
поделиться

Согласно Concepts in Programming Languages book, существует нечто, называемое Ingalls test, предложенное Dan Ingalls лидером группы Smalltalk. То есть:

Можете ли вы определить новый вид целого числа, помещайте ваши новые целые числа в прямоугольники (которые уже являются частью окна система), попросите систему очернить прямоугольник, и все ли работает?

И опять же, согласно книге, Smalltalk проходит этот тест, а C++ и Java - нет. К сожалению, книга не доступна онлайн, но вот некоторые поддерживающие слайды (слайд 33 отвечает на ваш вопрос).

1
ответ дан 2 December 2019 в 02:51
поделиться

Я полагаю, что вам нужно будет использовать [GroupIgnore] в перечислении и создать второе свойство, возвращающее целое значение:

[XmlRoot("GeoCoordinate")]
public class GeoCoordinate
{
    public enum AccuracyLevel
    {
        Unknown = 0,
        Country = 1,
        Region = 2,
        SubRegion = 3,
        Town = 4,
        PostalCode = 5,
        Street = 6,
        Intersection = 7,
        Address = 8,
        Premise = 9
    }

    private AccuracyLevel _accuracy;

    // ... more members


    [XmlIgnore]
    public AccuracyLevel Accuracy
    {
        get { return _accuracy; } 
        set { _accuracy = value;}
    }

    [XmlElement("AccuracyLevel")]
    public int AccuracyLevelInt
    {
        get {return (int) AccuracyLevel;}
        set {AccuracyLevel = (AccuracyLevel) value;}
    }
}

Обратите внимание, что [Serializable] не используется XML-сериализатором.

Также обратите внимание на то, что свойство AlignLeign Int , вероятно, реализовано неправильно. Я изучаю это сейчас.

-121--4349642-

Это мешает другим программистам делать глупости, которые они не должны пытаться делать в любом случае ...

-121--1886444-

Нет, поскольку он имеет типы данных, которые не являются объектами (например, int и байт ). Я считаю, что Smalltalk действительно ориентирован на объекты, но у меня есть лишь небольшой опыт работы с этим языком (около двух месяцев, примерно пять лет назад).

Я также слышал заявления от толпы Руби, но у меня есть нулевой опыт с этим языком.

Это, конечно, с использованием определения «истинно ОО», означающего, что у него есть только объекты и нет других типов. Другие могут не согласиться с этим определением.


Кажется, после небольшого исследования Python (я понятия не имел о различии имя/объект, несмотря на то, что закодирован в нем в течение года или около того - больше обмануть меня, я думаю), что это действительно может быть ОО.

Следующий код хорошо работает:

#!/usr/bin/python
i = 7
print id(i)
print type(i)
print i.__str__()

вывод:

6701648
<type 'int'>
7

, так что даже базовые целые являются здесь объектами.

19
ответ дан 2 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: