Piszę wyjaśnienie dla jakiegoś kodu kursu i przypadkowo używam słów method
i function
zamiennie. Postanowiłem wrócić i poprawić sformułowanie, ale wpadłem w lukę w moim zrozumieniu.
Z tego, co rozumiem, podprogram jest a, function
jeśli nie działa na instancję klasy (jej efekt jest ograniczony do jej jawnego wejścia / wyjścia) i jest a, method
jeśli działa na instancji klasy (może przenosić skutki uboczne instancji, które czynią ją nieczystą).
Jest tutaj dobra dyskusja na ten temat. Zauważ, że zgodnie z przyjętymi definicjami odpowiedzi statyczna method
powinna w rzeczywistości być funkcją, ponieważ instancja nigdy nie jest niejawnie przekazywana i nie ma dostępu do elementów członkowskich żadnej instancji.
Mając to na uwadze, czy statyczne nie powinny methods
być w rzeczywistości funkcjami?
Z definicji nie działają na określonych instancjach klasy; są „przywiązani” do klasy tylko ze względu na pokrewieństwo. Widziałem kilka dobrze wyglądających witryn, które odnoszą się do statycznych podprogramów jako „metod” ( Oracle , Fredosaurus , ProgrammingSimplified ), więc albo wszystkie przeoczają terminologię, albo czegoś mi brakuje (przypuszczam, że to drugie) .
Chciałbym się upewnić, że używam właściwego sformułowania.
Czy ktoś może to wyjaśnić?
źródło
Odpowiedzi:
Ten cytat z 8.4.3.2 może pomóc:
Java chce tylko, abyś „myślał obiektowo”. Ponadto metody statyczne mają dostęp do otaczającego zakresu, który może obejmować stan. W pewnym sensie klasa jest jak sam obiekt.
źródło
@FunctionalInterface
adnotacją i jedną metodą pod maską. Lambda to po prostu cukier syntaktyczny i pod tym względem nie ma nic nowego.Prosta odpowiedź jest taka, że kiedy Java zdecydowała się nazywać wszystko „metodą”, nie obchodziło ich rozróżnienie między funkcją a metodą w informatyce teoretycznej.
źródło
Metody statyczne nie są dokładnie funkcjami, różnica jest subtelna, ale ważna.
Metoda statyczna wykorzystująca tylko podane parametry wejściowe jest zasadniczo funkcją.
Jednak metody statyczne mogą uzyskiwać dostęp do zmiennych statycznych i innych funkcji statycznych (również wykorzystujących zmienne statyczne), więc metody statyczne mogą mieć stan zasadniczo różny od funkcji, które z definicji są bezstanowe . (DODATEK: Podczas gdy programiści często nie są tak restrykcyjni w używaniu „funkcji” jako definicji, ścisła funkcja w informatyce może mieć dostęp tylko do parametrów wejściowych). Zatem definiując ten przypadek dostępu do pól statycznych, nie można powiedzieć, że metody statyczne są zawsze funkcjami.
Inną różnicą, która uzasadnia użycie „metody statycznej”, jest to, że w C derywuje funkcje globalne i zmienne globalne, do których można uzyskać dostęp wszędzie. Jeśli nie możesz uzyskać dostępu do klasy, która zawiera metody statyczne, metody te również są niedostępne. Tak więc „metody statyczne” mają ograniczony zakres ze względu na projekt w przeciwieństwie do funkcji globalnych.
źródło
W Javie klasa zdefiniowana przez użytkownika jest w rzeczywistości instancją podklasy java.lang.Class.
W tym sensie metody statyczne są dołączane do instancji klasy pojęciowej: są dołączane do instancji podklasy java.lang.Class.
Mając to na uwadze, termin „metoda klasowa” (alternatywna nazwa metod statycznych Javy) zaczyna mieć sens. A termin „metoda klasowa” można znaleźć w wielu miejscach: Objective C, Smalltalk i JLS - żeby wymienić tylko kilka.
źródło
W informatyce funkcja wyraźnie odwzorowuje metodę statyczną. Ale „metoda” klasy jest nieco ogólna, jak „element członkowski” (element członkowski pola, element członkowski metody). Istnieją sformułowania takie jak
A więc powód jest taki, że, jak powiedział filozof Ludwig Wittgenstein, język jest narzędziem o różnych kontekstach. „Metoda” to fajny pseudonim w powyższym cytacie, służący do kategoryzacji „członka”.
źródło
Twoje myślenie jest właściwe i ma sens. Nie jest to po prostu ustalona terminologia w społeczności Java. Pozwólcie, że wyjaśnię niektóre wewnętrzne elementy, które mogą pomóc zrozumieć, dlaczego terminologia istnieje.
Java to język obiektowy oparty na klasach. Metoda jest zawsze członkiem klasy lub instancji (jest to ogólna instrukcja poprawna również dla innych języków programowania). Myślimy, że klasa i instancja są obiektami.
Metoda instancji (dynamiczna)
Nie możesz wywołać tej metody bezpośrednio z klasy, musisz utworzyć instancję. Każda instancja odwołuje się do tej metody. Definicję metody można nadpisać dokładnie tą samą sygnaturą metody (podczas tworzenia podklas), tj. Odwołanie wskazuje na inną metodę (która ma ten sam podpis, ale może mieć inną treść metody). Metoda jest dynamiczna.
Metoda klasowa (statyczna)
Możesz wywołać tę metodę tylko bezpośrednio z klasy, tj. Nie musisz tworzyć instancji tej klasy. W całym programie istnieje tylko jedna globalna definicja tej metody. Nie można nadpisać dokładnie tej samej sygnatury metody, gdy metoda jest zadeklarowana jako statyczna, ponieważ istnieje tylko jedna definicja ważna dla całego programu. Zwróć uwagę, że metoda jest składową samego obiektu klasy, a wszystkie instancje mają takie same unikalne (i poprawione) odwołania do tej metody.
źródło
Oto inne podejście do terminologii, używając Scali jako mnemonika:
W Scali masz
object
s, które są pojedynczymi instancjami niejawnie zdefiniowanej klasy1 .Zgodnie z twoją definicją możemy wywołać te podprogramy należące do
object
metod , ponieważ działają one na pojedynczym wystąpieniu klasy.Dodatkowo obiekt zdefiniuje również klasę A i utworzy wszystkie metody w obiekcie A jako metody statyczne w klasie A (do współpracy z Javą) [2] .
Dlatego możemy powiedzieć, że statyczne metody klasy A w Javie mają dostęp do tych samych elementów członkowskich, co instancja pojedyncza Scala, która zgodnie z twoją definicją zasługuje na miano (statycznych) metod klasy A.
źródło
object
odniesienie ma dużo sensu. Dziękuję Ci.Oczywiście główna różnica polega na tym, że metoda może wykorzystywać pola statyczne, a nie tylko parametry metody. Ale jest jeszcze jeden - polimorfizm! Wyniki oceny Class A.doTheSameStaticMethod () i ClassB.doTheSameStaticMehod () będą zależne od klasy. W tym przypadku funkcja jest bezsilna.
źródło
Każda klasa ma reprezentujący ją obiekt, który jest instancją podklasy tej
Class
klasy. Metody statyczne są w rzeczywistości metodami instancji tych obiektów, które są instancjami podklasy Class. Mają dostęp do stanu w postaci pól statycznych, więc nie są ograniczone tylko do funkcji (bezstanowych). To są metody.źródło