Разница между классом и структурой в PHP и Java

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

Некоторые люди говорят, что есть только одно различие: члены структуры по умолчанию общедоступны, а члены класса по умолчанию закрыты.

Некоторые говорят, что различий много.

После прочтения многих статей и форумов у меня есть следующие отличия:

Классы ПО УМОЛЧАНИЮ имеют частные члены. Структуры ПО УМОЛЧАНИЮ имеют открытые члены.

Структуры являются типом значений. Классы относятся к ссылочному типу.

Структура хранится в памяти через стек. Классы хранятся в памяти через кучу.

Структура не поддерживает наследование. Классы поддерживают наследование.

Конструктор работает иначе.

«новый» оператор работает по-другому.

Выделение памяти для структуры происходит очень быстро, потому что это происходит в строке или в стеке.

Каково ваше мнение о моем списке выше, или у вас другое. Спасибо


person Naveed    schedule 17.12.2009    source источник
comment
Классы и структуры имеют разные значения на разных языках. Вы должны сообщить нам, на каком языке вы говорите.   -  person Oded    schedule 17.12.2009
comment
Я полагаю, вы имеете в виду C++, но даже там вы ошиблись в некоторых моментах.   -  person Georg Schölly    schedule 17.12.2009
comment
Я полагаю, что он имеет в виду C#, иначе все пункты, кроме первого, неверны.   -  person    schedule 17.12.2009
comment
Если это зависит от языка, я хотел бы знать о PHP/Java. Мне интересны эти языки для интервью.   -  person Naveed    schedule 17.12.2009
comment
AFAIR, его нет, так как ни в Java, ни в PHP нет структур;)   -  person el.pescado    schedule 17.12.2009


Ответы (4)


Это довольно специфично для языка. Кажется, вы смешиваете изрядную долю как С++, так и С#, оба из которых являются очень разными языками (несмотря на внешнее сходство в синтаксисе).

В C++ structs действительно по умолчанию имеет видимость public члена, а class по умолчанию - private. В C# struct используется для объявления типов значений, которые передаются по значению (обратите внимание, что выделение стека является деталью реализации, а не контрактом).

Как правило, оба языка, кажется, имеют одинаковое представление о том, что struct и class должны представлять: struct предназначен для простых структур данных, которые делают немного больше, чем просто хранят данные, в то время как классы имеют состояние и методы для управления ими. Они используются для создания объектов в некотором конкретном или абстрактном смысле, в то время как структуры данных — это просто данные в структурированной форме; им не нужно много делать с этими данными или даже знать, что это за данные. По сути они тупые и им все равно.

Но именно так разработчики языка думали, что их следует использовать. Люди хороши в неправильном использовании вещей, поэтому не каждый struct, который вы видите, может быть простой, глупой структурой данных, и не каждый class, который вы видите, может быть полноценным классом с множеством методов и тому подобным. Это просто соглашение, и если люди следуют ему, другие могут посмотреть на код и увидеть: «О, хорошо, это struct, так что я не ожидаю здесь много логики и перейду к более интересным вещам». Это может сработать... в теории.

ETA: Поскольку вы упомянули в комментарии, что вас особенно интересует PHP или Java: оба языка нет каких-либо различий на уровне синтаксиса или языка class или struct, которые вот почему ваш вопрос кажется мне немного странным. И в Java, и в PHP вы моделируете вещи как классы, независимо от того, являются ли они просто структурами данных без логики или реальными классами со всем, что есть.

person Joey    schedule 17.12.2009
comment
Когда меня кто-то спрашивал об этой разнице во время интервью, они не зависят ни от какого языка. Я думал, что это общий вопрос. - person Naveed; 17.12.2009
comment
НАВЕЕД: Дело в том, что многие языки имеют разные средства и возможности. Если бы вопрос был таким же общим, как разница между классом и структурой данных, то на самом деле нетрудно ответить. Но то, что вы перечислили в своем вопросе, представляло собой красочное лоскутное одеяло из функций C++ и C#, касающихся ключевых слов class и struct, поэтому было немного сложно понять, о чем точно был ваш вопрос. А что касается разных языков, то ответ очень сильно зависит от того, что это за языки. Как уже отмечалось, в Java, например, есть классы только для всего, независимо от структуры данных. - person Joey; 17.12.2009
comment
Спасибо за ваш ответ. Сначала мой вопрос был общим, и мои пункты в моих вопросах тоже были общими (это мое мнение, может быть неправильное). Когда пользователи спрашивали о конкретном языке, я проявлял интерес к PHP и JAVA. Мои пункты могут быть неправильными в целом, поэтому я спросил ваши мысли в конце моего вопроса. Это обсуждение действительно расширяет мои знания. спасибо - person Naveed; 17.12.2009

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

person Community    schedule 17.12.2009

С точки зрения ОО разницы нет. Оба типа имеют общедоступный API с методами (и свойствами, если ваш язык их поддерживает).

С технической точки зрения может быть много различий, но это зависит от языка и/или платформы.

Когда дело доходит до объектно-ориентированного проектирования, я просто предпочитаю игнорировать существование такой вещи, как структура, поскольку она не дает мне никаких дополнительных возможностей или функций. По мере того, как мы углубляемся в реализацию, класс может оказаться лучше реализованным как структура, но это чистая деталь реализации.

person Mark Seemann    schedule 17.12.2009

Разница между структурой и классами

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

-Если мы явно укажем тип доступа для каждого члена, то структура будет вести себя точно так же, как класс.

person Rohan Nalavade    schedule 28.08.2013