Waarom wordt een statische methode als een methode beschouwd?

Ik ben een uitleg aan het schrijven voor een of andere code voor een cursus en heb per ongeluk de woorden methoden functiondoor elkaar gebruikt. Ik besloot terug te gaan en de formulering te corrigeren, maar liep tegen een gat aan in mijn begrip.

Voor zover ik begrijp, is een subroutine een functionals deze niet werkt op een instantie van een klasse (het effect is beperkt tot de expliciete invoer/uitvoer) en is een methodals het werkt op een instantie van een klasse (het kan bijwerkingen hebben op de instantie die het onzuiver maken).

Er is een goede discussie hierover het onderwerp. Merk op dat volgens de definities van het geaccepteerde antwoord, een statische methodeigenlijk een functie zou moeten zijn, omdat een instantie nooit impliciet wordt doorgegeven en geen toegang heeft tot de leden van een instantie.

Met dit in gedachten, zouden statische methodseigenlijk geen functies moeten zijn?

Volgens hun definitie handelen ze niet op bepaalde instanties van een klasse; ze zijn alleen “gebonden” aan de klas vanwege een relatie. Ik heb een paar goed uitziende sites gezien die verwijzen naar statische subroutines als “methoden” (Oracle, Fredosaurus, ProgrammingSimplified), dus ofwel kijken ze allemaal uit over de terminologie, of ik mis iets (ik vermoed het laatste).

Ik wil er zeker van zijn dat ik de juiste bewoording gebruik.
Kan iemand dit ophelderen?


Antwoord 1, autoriteit 100%

Dit citaat van 8.4 .3.2kan helpen:

Een methode die staticis gedeclareerd, wordt een klassemethodegenoemd.

Een methode die niet staticis gedeclareerd, wordt een instantiemethode[…] genoemd.

  • Klasse methoden: gekoppeld aan een klasse.
  • Instance-methoden: gekoppeld aan een instance.

Java wil gewoon dat je ‘objectgericht denkt’. Statische methoden hebben ook toegang tot een omringend bereik dat state kan bevatten. In zekere zin is de klasse als een object zelf.


Antwoord 2, autoriteit 63%

Het simpele antwoord is dat toen Java besloot alles een “methode” te noemen, ze zich niet druk maakten over het onderscheid tussen een functie en een methode in de theoretische informatica.


Antwoord 3, autoriteit 20%

Statische methoden zijn niet echt functies, het verschil is subtiel, maar belangrijk.

Een statische methode die alleen bepaalde invoerparameters gebruikt isin wezen een functie.

Maar statische methoden kunnen toegang hebben tot statische variabelen en andere statische functies (ook met behulp van statische variabelen), dus statische methoden kunnen een statushebben die fundamenteel verschilt van een functie die per definitie staatloos.
(TOEVOEGEN: Hoewel programmeurs vaak niet zo strikt zijn met het gebruik van “functie” als definitie, heeft een strikte functie in de informatica alleen toegang tot invoerparameters). Dus het definiëren van dit geval van toegang tot statische velden is niet geldig om te zeggen dat statische methoden altijd functies zijn.

Een ander verschil dat het gebruik van “statische methode” rechtvaardigt, is dat je in C globale functies en globale variabelen kunt definiëren die overal toegankelijk zijn. Als u geen toegang kunt krijgen tot de klasse die statische methoden bevat, zijn de methoden ook ontoegankelijk. Dus “statische methoden” zijn qua ontwerp beperkt qua reikwijdte in tegenstelling tot globale functies.


Antwoord 4, autoriteit 13%

In Java is een door de gebruiker gedefinieerde klasse eigenlijk een instantie van een subklasse van java.lang.Class.

In die zin zijn statische methoden zijngekoppeld aan een instantie van een conceptuele klasse: ze zijn gekoppeld aan een instantie van een subklasse van java.lang.Class.

Met dit in gedachten begint de term “klassenmethode” (een alternatieve naam voor de statische methoden van Java) logisch te worden. En de term ‘klassenmethode’ kan op veel plaatsen worden gevonden: Objective C, Smalltalk en de JLS – om er maar een paar te noemen.


Antwoord 5, autoriteit 9%

In de informatica is functieduidelijk gekoppeld aan een statische methode. Maar “methode” van een klasse is een beetje generiek, zoals “lid” (veldlid, methodelid). Er zijn formuleringen als

Gegevensleden en methodeleden hebben twee aparte naamruimten: .x en .x() kunnen naast elkaar bestaan.

Dus de reden is dat, zoals de filosoof Ludwig Wittgenstein zei, taal een hulpmiddel is met verschillende contexten. “Methode” is een mooie bijnaam in het citaat hierboven om een ​​”lid” te categoriseren.


Antwoord 6, autoriteit 7%

Uw denken is juist en het is logisch. Het is gewoon geen gevestigde terminologie in de Java-gemeenschap. Laat me wat interne aspecten uitleggen die kunnen helpen begrijpen waarom de terminologie bestaat.

Java is een op klassen gebaseerde objectgeoriënteerde taal. Een methode is altijd lid van een klasse of instantie (dit is een algemene verklaring die ook geldt voor andere programmeertalen). We denken dat klasse en instantie beide objecten zijn.

Exemplaarmethode (dynamisch)

Je kunt deze methode niet rechtstreeks vanuit een klasse aanroepen, je moet een instantie maken. Elke instantie verwijst naar die methode. U kunt een methodedefinitie overschrijven met exact dezelfde methodehandtekening (bij subclassificatie), d.w.z. de referentiepunten naar een andere methode (die dezelfde handtekening heeft, maar een andere methodetekst kan hebben). De methode is dynamisch.

Klasse methode (statisch)

Je kunt deze methode alleen rechtstreeks vanuit de klasse aanroepen, d.w.z. je hoeft geen instantie van die klasse te maken. Er is slechts één globale definitie van die methode in het hele programma. U kunt niet exact dezelfde methodehandtekening overschrijven wanneer de methode statisch wordt verklaard, omdat er slechts één definitie geldig is voor het hele programma. Merk op dat de methode lid is van het klasseobject zelf, de instanties hebben allemaal dezelfde unieke (en vaste) verwijzing naar die methode.


Antwoord 7, autoriteit 5%

Hier is een andere kijk op de terminologie, met behulp van Scalaals geheugensteuntje :
In Scala heb je objects, dit zijn enkele exemplaren van een impliciet gedefinieerde klasse 1.

Volgens uw definitie kunnen we deze subroutines die bij de objectmethodenhoren, noemen, aangezien ze werken op een enkele instantie van de klasse.
Bovendien zal het object klasse A ook definiëren en alle methoden in object A maken als statische methoden in klasse A (voor interfacing met Java)[2].

Daarom kunnen we zeggen dat de statische methoden van Java-klasse A toegang hebben tot dezelfde leden als de Scala singleton-instantie, die volgens uw definitie dan verdienen te worden genoemd (statische) methodenvan klasse A.


Antwoord 8, autoriteit 2%

Het belangrijkste verschil is natuurlijk dat de methode statische velden kan gebruiken, niet alleen methodeparameters.
Maar er is er nog één – polymorfisme!
Resultaten van evaluatie Class A.doTheSameStaticMethod() en ClassB.doTheSameStaticMehod() zijn afhankelijk van de klasse. In dit geval is de functie impotent.


Antwoord 9

Elke klasse heeft een object om het te vertegenwoordigen dat een instantie is van een subklasse van de klasse Class. Statische methoden zijn in feite instantiemethoden voor deze objecten die instanties zijn van een subklasse van Klasse. Ze hebben toegang tot state in de vorm van statische velden, dus ze zijn niet beperkt tot alleen (stateloze) functies. Het zijn methoden.

Other episodes