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