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

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

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

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

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

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

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

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

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

Конструктор работает по-разному.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Классы являются ссылочными типами, а Структуры – значениями. В отсутствие спецификатора доступа для базового класса public предполагается, когда объявлен производный класс struct и private, если класс объявлен классом.