Permalänk
Medlem

[Java] Statiska metoder och main

(Fick ett privat mail, men svar får inte vara längre än 2000 tecken. Hoppas du inte känner dig uthängd Seb74 8-) )

Citat:

Seb74 wrote on Igår 17:29:
Sorry, men det slog mig nyss, som en mardröm som dök upp från ingenstans, att main-metoden är ju static.

Vi gick ju igenom på forumet att statiska metoder kan bara komma åt statiska objekt, men main-metoden fungerar ju som vanligt utan sådana begränsningar (väl?).

Nej ditt påstående är fel. Mainmetoden är inte magisk på något sätt, utan beter sig och har precis samma rättigheter som vilken statisk metod som helst.

Antag att vi till exempel hade en mainmetod i klassen Punkt. Däri fanns ju två variabler, x och y. Vad skulle main anse det vara för värden på den?
Den kan inte anta någonting, och därför fungerar det inte heller.

Statiska metoder är metoder som bara är associerade med en klass, men inte individuella objekt av klassen.

Skulle main i Punkt vilja ha ett Punktobjekt så att den kan komma åt de icke statiska variablerna så får metoden helt enkelt instantiera upp en.

public static void main(String[] args) { Punkt punkt = new Punkt(1,2); System.out.println("X är: "+punkt.x); }

Citat:

Är det undantag för main, eller är det så att denna åtkomstregel endast gäller internt i varje klass? Så att om main-metoden vill komma åt för den egna klassen globala variabler så måste dessa vara deklarerade som static?
Medans vill den komma åt saker från andra klasser så är det sak samma om den själv är statisk eller ej.

Som sagt mainmetoden är inte annorlunda än någon annan statisk metod.

När JVMen startar så anger man ju en klass. JVMen går då till klassen och kollar om det finns en statisk metod som heter main(String[] ...) och sedan kör den. Det kan egentligen inte vara på annat sätt, för om mainklasen låg i Punkt till exempel så hade inte JVMen kunnat skapa en instans av Punkt eftersom konstruktorn tar två argument. Däremot går ju statiska metoder bra att köra, för de tillhör själva klassen och inte objektinstaner i sig.

Åtkomsträttigheter är inte annorlunda mellan klasser. Det är viktigt att förstå skilnaden mellan en statisk metod och icke statiska metoder, för att de är ju fundamentellt väldigt olika (och kan resultera i totalt kaos ifall man inte förstår dem rätt).

En statisk metod kan ALDRIG komma åt variabler som inte är statiska, för att de finns inte ifrån det statiska "namespacet". Icke statiska variabler finns bara i objekt (dvs instanser av en klass skapad med new) och statiska metoder kan därför inte komma åt dem utan att veta vilket object det är frågan om (de har fått ett objekt som argument till metoden till exempel).

Citat:

Mycket tacksam för svar....tror jag tänkt för mycket på detta nu

Nejdå, tror det finns lite mer att tänka på det, eftersom allt inte är helt på plats än 8-)

//C

Permalänk
Medlem

Hehe, lustigkurre där...göra narr av mig på forumet

Jag tolkade dig nog lite för strikt förut när du sa att en statisk metod kan bara komma åt statiska variabler/metoder. Det är alltså så att en statisk metod kan komma åt icke statiska variabler/metoder, MEN måste då göra detta via ett objekt?

Detta känns ju inte som någon direkt begränsning, eftersom man väl oftast inte lär vara särskilt intresserad av att komma åt icke-statiska variabler/metoder på klassnivå (det går ju inte ens, för är en variabel inte static så kan man inte komma åt den på klassnivå, men om man instansierar klassen så kan, ÄVEN MAIN, komma åt det den vill via objektet).

Alltså, detta är egentligen ingen begränsning man behöver tänka på för den är helt självklar?

Visa signatur

CCNA sedan juni 2006

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Seb74
Hehe, lustigkurre där...göra narr av mig på forumet

Jag tolkade dig nog lite för strikt förut när du sa att en statisk metod kan bara komma åt statiska variabler/metoder. Det är alltså så att en statisk metod kan komma åt icke statiska variabler/metoder, MEN måste då göra detta via ett objekt?

Detta känns ju inte som någon direkt begränsning, eftersom man väl oftast inte lär vara särskilt intresserad av att komma åt icke-statiska variabler/metoder på klassnivå (det går ju inte ens, för är en variabel inte static så kan man inte komma åt den på klassnivå, men om man instansierar klassen så kan, ÄVEN MAIN, komma åt det den vill via objektet).

Precis helt rätt. Den statiska metoden kommer åt ett objekt (eller rättare sagt en objektreferens) genom antingen parametrar in till metoden eller så genom att den skapar nya objekt (via new). Din sammanfattning är alltså korrekt.

Citat:

Alltså, detta är egentligen ingen begränsning man behöver tänka på för den är helt självklar?

Precis 8-). Det är dina ord själv om självklarhet (det tog lite tid att komma till de här slutsatserna) men visst, det är helt logiskt om man har förstått konceptet.

//C

Permalänk
Avstängd

Välkommen till Sweclockers.com, Sveriges största chattrum;)

Visa signatur

Om dåliga kommentarer vore vatten skulle jag behövt en flytväst...
www.Agge.tk
-Ja har visst vart ute idag. -Vart då? -Jag öppnade fönstret förut...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av AggeMan
Välkommen till Sweclockers.com, Sveriges största chattrum;)

Jag vet inte ifall det är jag som tolkar detta felaktigt som dold kritik. Om någon ställer en fråga så tycker jag det är bättre att försöka beskriva tillvägagångssättet och bakgrundsinformationen så att personen kan angripa problemet själv än att bara säga svaret rent ut.

Att bara få reda på svaret är nödvändigtvis ingen hjälp utan bara ett undanröjande av ett litet hinder. När personen sedan provar direkt efteråt och får samma problem igen så är det bara att fråga på nytt. Då är det tveksamt om personen någonsin lär sig något.

Om det krävs ett par bollande av inlägg för att få fram en bra lösning i situationen så får det göra det. Om inte annat så finns resonemanget kvar i forumet och kan användas som referens till liknande frågor igen.

Man ska aldrig vara rädd att fråga.

Nu tror jag inte det var någon större form av kritik. Väntar mer på en moderator ska komma och säga att jag fyller sweclockers disk 8-).

//C