2012-04-14 3 views
1

Мне вдруг стало интересно, почему у нас есть нестатические функции/методы? Метод не является свойством объекта (например, атрибутом/элементом данных), и все экземпляры этого класса используют один и тот же метод, поэтому почему существует дифференциация между статическими и нестационарными методами? Означает ли это, что когда экземпляр объекта создается, он содержит копию методов, которые являются точными для всех экземпляров этого класса?Почему у нас есть нестатические функции/методы?

EDIT: что со всеми отрицательными точками? Моя точка действительна - поведение метода не изменяется на экземпляр объекта. Метод одинаковый для каждого объекта, только другой объект вызывает метод, поэтому зачем нам нужно сделать часть метода объектом? Почему метод не может быть сохранен один раз (как статический метод), а затем при использовании «this» мы выполняем на соответствующем объекте? Кажется, глупо хранить нестатические методы, являются частью объекта для каждого экземпляра.

+6

«Метод не является свойством объекта» - это так. Код не дублируется, но он очень важен для существования объекта. –

+3

Вы можете рассматривать его как просто набор статических методов, которые имеют невидимый кадр данных, на которые ссылается «this» :-). – Robinson

+4

Почему у нас есть * статические * функции/методы в Java/C++/OOP? –

ответ

3

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

5

Статические методы обычно не зависят от состояния объекта или не изменяют его. Обычно нестатические методы.

Что касается, если код метода включен в каждый экземпляр объекта, нет, это не так.

В основном каждый метод определяется один раз, а затем this беззвучно передается в качестве параметра. Немного упрощения, но мы надеемся, что все получится.

+1

Итак, это имеет смысл, поэтому как нестатические, так и статические методы сохраняются только один раз в классе, но нестатические методы могут быть вызваны с помощью экземпляров. – user997112

+0

Да, в основном. Хотя, они не хранятся «в классе», потому что, как только он скомпилирован до байт-кода, нет концепции высокого уровня класса. Статические и нестатические методы скомпилированы до функций. Нестатические передаются параметром 'this', тогда как нестатические - нет. (Хотя, конечно, это не фактически «это» при передаче, а адрес данных, который идет с экземпляром) – Corbin

1

Нестатические методы могут обращаться к данным (свойству/атрибутам) экземпляра. Статические методы не могут, поскольку они не «принадлежат» экземпляру класса. Это точка объектно-ориентированного программирования. Вы инкапсулируете данные и функциональные возможности, которые работают над этими данными.

1

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

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

1

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

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

+1

Я понимаю, что такое статический метод. Я просто спрашивал, нужно ли/нам хранить несколько копий нестатического метода, потому что я думал, что каждый экземпляр сохранил свою собственную копию, что казалось глупым. – user997112

+0

На некоторых языках, например JavaScript, вы действительно можете переопределить методы для каждого экземпляра. Таким образом, вы * можете * иметь метод, хранящийся непосредственно на экземпляре. Но даже тогда это ссылка, а не полная копия кода. Если вы назначаете один и тот же метод двум различным экземплярам, ​​они оба относятся к одной и той же копии кода. – Wyzard

1

Статические функции не связаны с экземпляром объекта. Функции членов - это то, откуда приходит ключевое слово this; компилятор передает его как скрытый аргумент функции-члена, а не статические.

1

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

1

Хорошо, посмотрим ...

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

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

Означает ли это, что когда экземпляр объекта создается, он содержит копию методов, которые являются точными для всех экземпляров этого класса?

Это зависит от языка, но обычно нет.

В Java, например, существует только одна копия метода, совместно используемого для всех экземпляров класса. Методы не являются «частью» данных для экземпляров класса. В JavaScript можно получить этот общий доступ, используя цепочку [[прототип]] или, в меньшей степени, путем повторного использования функции-объекта для того же метода в разных случаях. (Тем не менее, можно также создать новый метод для каждого нового например, в JavaScript, но это выбор программиста.)

В Java «Сообщение» передается для вызова метода экземпляра; то есть он смотрит на конкретный тип и отправляет ему сообщение вместе с соответствующим экземпляром «this». (Это сложнее, чем это из-за виртуальной диспетчеризации, но ... ключ к сведению - есть только один копия метода для определенного типа загружается в память.)

В JavaScript метод a первоклассное значение (это объект), который назван через свойство объекта объекта (или найденного в [[прототипе]]), который динамически связан с ресивером (т. е. внутри установлено на основании как это называется). Python работает аналогично JavaScript в этих методах: первоклассные функции, которые извлекаются и вызывается (но методы по-прежнему «привязаны» к классу, что в отличие от JavaScript). Ruby больше похож на Java в том, что «отправляются сообщения», что в свою очередь вызывает метод (который является не первоклассным значением в Ruby) и неявно связывает контекст с получателем. Все эти языки поддерживают различные формы «подклассификации» (назовите это, как вы можете), чтобы настроить MRO и совместно использовать общие для экземпляров методы.

Метод одинаковый для каждого объекта, только другой объект вызывает метод, поэтому зачем нам нужно сделать часть метода объектом? Почему метод не может быть сохранен один раз (как статический метод), а затем при использовании «this» мы выполняем на соответствующем объекте? Кажется, глупо хранить нестатические методы, являются частью объекта для каждого экземпляра.

Это то, что многие из языка делают - в том числе Java, C++, Python (обычно) и Руби (обычно) и JavaScript (часто), и это очень действительная точка для экономии памяти и накладные расходы.

Счастливое кодирование!