Почему статический метод считается методом?
Я пишу объяснение для некоторого кода для курса и случайно использовал слова method
и function
взаимозаменяемо. Я решил вернуться и исправить формулировку, но столкнулся с ямой в своем понимании.
Из того, что я понимаю, подпрограмма является function
, если она не действует на экземпляр класса (его эффект ограничен его явным вводом/выводом) и является method
, если он работает экземпляр класса (он может выполнять побочные эффекты на экземпляре, который делает его нечистым).
Здесь хорошая дискуссия здесь. Обратите внимание, что согласно принятым определениям ответов статический method
должен быть фактически функцией, потому что экземпляр никогда не передается неявным образом и не имеет доступа к каким-либо членам экземпляра.
Если это ум, не должны ли статические methods
быть функциями?
По своему определению они не действуют на отдельные экземпляры класса; они только "привязаны" к классу из-за отношения. Я видел несколько хороших сайтов, которые ссылаются на статические подпрограммы как на "методы" (Oracle, Fredosaurus, ProgrammingSimplified), так что либо они все пропускают терминология, или я что-то упускаю (моя догадка - последняя).
Я хотел бы убедиться, что использую правильную формулировку.
Кто-нибудь может это прояснить?
Ответы
Ответ 1
Эта цитата из 8.4.3.2 может помочь:
Метод, объявленный static
, называется методом класса.
Метод, который не объявлен static
, называется методом экземпляра [...].
- Методы класса: связанные с классом.
- Методы экземпляра: связанные с экземпляром.
Java просто хочет, чтобы вы "думали объектно-ориентированным". Кроме того, статические методы имеют доступ к окружающей области, которая может включать состояние. В некотором смысле класс похож на сам объект.
Ответ 2
Простой ответ заключается в том, что, когда Java решила называть все "методом", они не заботились о различии между функцией и методом теоретической информатики.
Ответ 3
Статические методы не являются точно функциями, разница тонкая, но важная.
Статический метод, использующий только заданные входные параметры, по существу является функцией.
Но статические методы могут обращаться к статическим переменным и другим статическим функциям (также используя статические переменные), поэтому статические методы могут иметь состояние, которое принципиально отличается от функции, которая по определению является апатридом.
(ДОБАВЛЕНИЕ: В то время как программисты часто не настолько строги с использованием "функции" в качестве определения, строгая функция в информатике может иметь доступ только к входным параметрам). Поэтому, определяя этот случай обращения к статическим полям, нельзя сказать, что статические методы всегда являются функциями.
Другим отличием, которое оправдывает использование "статического метода", является то, что вы можете определить в C производные глобальные функции и глобальные переменные, к которым можно получить доступ повсюду. Если вы не можете получить доступ к классу, который содержит статические методы, методы также недоступны. Таким образом, "статические методы" ограничены по своей структуре дизайном в отличие от глобальных функций.
Ответ 4
В Java пользовательский класс фактически является экземпляром подкласса java.lang.Class.
В этом смысле статические методы привязаны к экземпляру концептуального класса: они привязаны к экземпляру подкласса java.lang.Class.
С учетом этого, термин "метод класса" (альтернативное имя для статических методов Java) начинает иметь смысл. И термин "метод класса" можно найти во многих местах: Objective C, Smalltalk и JLS - чтобы назвать только несколько.
Ответ 5
В информатике функция четко отображает статический метод. Но "метод" класса немного обобщен, например "член" (член поля, член метода). Есть такие формулировки, как
Элементы данных и члены метода имеют два отдельных пространства имен:.x и .x() могут сосуществовать.
Итак, причина в том, что, как сказал философ Людвиг Витгенштейн, язык - это инструмент с разными контекстами. "Метод" - это хороший прозвище в цитате выше, чтобы классифицировать "участника".
Ответ 6
Ваше мышление правильное, и это имеет смысл. Это просто не установлена терминология в сообществе Java. Позвольте мне объяснить некоторые внутренние факторы, которые могут помочь понять, почему существует терминология.
Java - это объектно-ориентированный язык, основанный на классе. Метод всегда является членом класса или экземпляра (это общий оператор, действительный для других языков программирования). Мы считаем, что класс и экземпляр являются обоими объектами.
Метод экземпляра (динамический)
Вы не можете вызвать этот метод из класса напрямую, вам нужно создать экземпляр. Каждый экземпляр ссылается на этот метод. Вы можете переписать определение метода с помощью той же самой сигнатуры метода (при подклассификации), т.е. Ссылка указывает на другой метод (который имеет одну и ту же подпись, но может иметь другое тело метода). Этот метод является динамическим.
Метод класса (статический)
Вы можете вызвать этот метод только из класса, т.е. вам не нужно создавать экземпляр этого класса. Во всей программе есть только одно глобальное определение этого метода. Вы не можете перезаписывать ту же самую сигнатуру метода, когда метод объявлен статическим, потому что для всей программы существует только одно определение. Обратите внимание, что этот метод является членом самого объекта класса, экземпляры имеют все те же уникальные (и исправляющие) ссылки на этот метод.
Ответ 7
Вот еще один подход к терминологии, используя Scala как мнемоника:
В Scala у вас есть object
s, которые являются одноточечными экземплярами неявно определенного класса 1.
В соответствии с вашим определением мы можем вызывать эти подпрограммы, принадлежащие методам object
, поскольку они работают с одним экземпляром класса.
Кроме того, объект также определит класс A и создаст все методы в объекте A как статические методы класса A (для взаимодействия с Java) [2].
Поэтому мы можем сказать, что статические методы класса Java A получают доступ к тем же членам, что и экземпляр Scala singleton, который в соответствии с вашим определением заслуживает того, чтобы его вызывали (статические) методы класса A.
Ответ 8
Конечно, основное отличие - метод может использовать статические поля, а не только параметры метода.
Но есть еще один - полиморфизм!
Результаты оценки Класс A.doTheSameStaticMethod() и ClassB.doTheSameStaticMehod() будут зависеть от класса. В этом случае функция импотента.
Ответ 9
У каждого класса есть объект, представляющий его, который является экземпляром подкласса класса Class
. Статические методы - это действительно методы экземпляра для этих объектов, которые являются экземплярами подкласса класса. Они имеют доступ к состоянию в виде статических полей, поэтому они не ограничиваются просто функциями (без гражданства). Это методы.