/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Static metoder - hvad er det og hvorfor?
Fra : DenverDino


Dato : 19-12-01 16:14

public class Test {

public static void main(String[] args) {
int kroner;
System.out.println(kroner);
kroner = 50;
kroner = (int)(kroner * getDollarKurs());
System.out.println(kroner*getDollarKurs());
}

public double getDollarKurs() {
return 8.39;
}
}

Når linien kroner = (int)(kroner * getDollarKurs()); skal køres kommer min
compiler og siger...

2) Cannot make a static reference to the instance method named getDollarKurs
for class kap2.Test with arguments ()

Det er selvfølgelig fordi den ikke kan "Se" metoden getDollarKurs() - det er
altså det med Static jeg ikke fatter - jeg ved at hvis jeg gør selve metoden
getDollarKurs() til static - så vil det virke - men hvorfor virker det ikke
som det er nu? og hvis en samtidig gider at forklare static attributter..






 
 
Martin Ehmsen (19-12-2001)
Kommentar
Fra : Martin Ehmsen


Dato : 19-12-01 16:20

DenverDino wrote:

> public class Test {
>
> public static void main(String[] args) {
> int kroner;
> System.out.println(kroner);
> kroner = 50;
> kroner = (int)(kroner * getDollarKurs());
> System.out.println(kroner*getDollarKurs());
> }
>
> public double getDollarKurs() {
> return 8.39;
> }
> }
>
> Når linien kroner = (int)(kroner * getDollarKurs()); skal køres
kommer min
> compiler og siger...
>
> 2) Cannot make a static reference to the instance method named
getDollarKurs
> for class kap2.Test with arguments ()
>
> Det er selvfølgelig fordi den ikke kan "Se" metoden getDollarKurs() -
det er
> altså det med Static jeg ikke fatter - jeg ved at hvis jeg gør selve
metoden
> getDollarKurs() til static - så vil det virke - men hvorfor virker
det ikke
> som det er nu? og hvis en samtidig gider at forklare static
attributter..

Det er fordi du forsøger at kalde en metode i en klasse som du ikke har
instancieret (eller hvordan det nu lige staves .
Du bliver nødt til at lave en instans af klassen Test for at kunne
bruge metoden eller også skal den gøres statisk og så kaldes med
Test.getDollarKurs();

Mvh.
Martin Ehmsen
--
"Life is good for only two things,
discovering mathematics and teaching mathematics"
Siméon Poisson

Martin Ehmsen (19-12-2001)
Kommentar
Fra : Martin Ehmsen


Dato : 19-12-01 16:22

Martin Ehmsen wrote:
> Det er fordi du forsøger at kalde en metode i en klasse som du ikke
har
> instancieret (eller hvordan det nu lige staves .
> Du bliver nødt til at lave en instans af klassen Test for at kunne
> bruge metoden eller også skal den gøres statisk og så kaldes med
> Test.getDollarKurs();

Lige for at følge op mit indlæg, så skal du se main metoden som en
metode "uden for alting", dvs. de ting som ligger den klasse main
metoden ligger i, ikke hører sammen med main-metoden.
Main er noget for sig selv. Det er en god måde at huske det på, så får
man ikke sådan nogle fejl.

Mvh.
Martin Ehmsen
--
"Life is good for only two things,
discovering mathematics and teaching mathematics"
Siméon Poisson

Brian Matzon (19-12-2001)
Kommentar
Fra : Brian Matzon


Dato : 19-12-01 16:26

"DenverDino" <writetong@plz.com> wrote in message news:x82U7.502$aS.78233@news010.worldonline.dk...
> public class Test {
>
> public static void main(String[] args) {
> int kroner;
> System.out.println(kroner);
> kroner = 50;
> kroner = (int)(kroner * getDollarKurs());
> System.out.println(kroner*getDollarKurs());
> }
>
> public double getDollarKurs() {
> return 8.39;
> }
> }
>
> Når linien kroner = (int)(kroner * getDollarKurs()); skal køres kommer min
> compiler og siger...
>
> 2) Cannot make a static reference to the instance method named getDollarKurs
> for class kap2.Test with arguments ()
>
> Det er selvfølgelig fordi den ikke kan "Se" metoden getDollarKurs() - det er
> altså det med Static jeg ikke fatter - jeg ved at hvis jeg gør selve metoden
> getDollarKurs() til static - så vil det virke - men hvorfor virker det ikke
> som det er nu? og hvis en samtidig gider at forklare static attributter..

Statiske metoder og attributter, tilhører klassen - og ikke objektet.
I ovenstående eksempel kan du ikke kalde getDollarKurs, da denne metode
er en del af objektet (af typen Test) - du skal instantiere denne for
at kunne bruge dens metode. Modsat er statiske metoder og attributter
tilknyttet klassen, og du kan derfor kalde den på klassen direkte.

se iøvrigt:
http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html

/Brian Matzon



Lars Dam (19-12-2001)
Kommentar
Fra : Lars Dam


Dato : 19-12-01 16:43

On Wed, 19 Dec 2001 16:13:34 +0100, "DenverDino" <writetong@plz.com>
wrote:

>Det er selvfølgelig fordi den ikke kan "Se" metoden getDollarKurs() - det er
>altså det med Static jeg ikke fatter - jeg ved at hvis jeg gør selve metoden
>getDollarKurs() til static - så vil det virke - men hvorfor virker det ikke
>som det er nu? og hvis en samtidig gider at forklare static attributter..

det er egentligt ret simpelt:

ikke-static metoder/attributter gælder for instanser af objekter, mens
at static metoder/attributter gælder for klassen.

En klasse er en beskrivelse af hvordan et objekt af klassen opfører
sig. Dvs. at de ikke-statiske definitioner du laver gælder for
instanser af klassen; hvert objekt af klassen har sin egen
metode/attribut hvis de erklæres ikke statiske.

Nu kan det være at du f.eks. ønsker at have en beskrivelse som er
fælles for alle objekter for klassen; det bruger man så static til.

eks.:

class Bil{
String nummer;
String farve;
static int antalBilerIAlt=0;
public Bil( String nummer, String farve ){
antalBilerIAlt++;
this.nummer = nummer;
this.farve = farve;
}
}

Hver gang du opretter en bil, får du et objekt med et nummer, og en
farve. Derudover holdes der også styr på hvor mange biler der ialt er
blevet lavet. Dvs. antalBilerIalt attributten findes kun een gang, og
er ikke tilknyttet en bestemt instans, men gælder for alle instanser.
hver instans har tilgengæld sin egen nummer/farve værdi.

Forskellen er altså at static medlemmer gælder for klasse
beskrivelsen, mens ikke-static gælder for hver instans.

Normalt når man udvikler OO, bruger man ikke static; men har man brug
for at holde styr på informationer vedrørende en klasse, kan man
således bruge static til dette. static kan også bruge i sammenhænge
hvor man har nogle generelle informationer vedrørende klassen, så som
konstanter.

* * * *

Når du så får kompiler fejl i dit eksempel, er det fordi den kode der
afvikles i main, kører i et static kontekst (altså kode der gælder for
klassen, og ikke noget bestemt objekt), og prøver at kalde noget kode
der kun kan afvikles for en instans af klassen.

Den nemmeste løsning er at lave getDollarKurs() static; den lidt mere
komplekse, er at lave en instans af din beregning, og udføre
beregningen i en instans af klassen.

Hvilken løsning der er den pæneste OO mæssigt afhænger af
problemstillingen.

Men den alternative løsning kan ligne flg:

public class Test{
public static void main( String[] args ){
Test test = new Test( 50 );
System.out.println( test.beregn( getDollarKurs() ) );
}
private int kroner = 0;
public Test( int kroner ){
this.kroner = kroner
}
public int beregnKurs( double kurs ){
return kroner*kurs;
}
public static double getDollarKurs(){
return 8.39;
}
}

Læg mærke til at getDollarKurs() stadig er static, idet at
dollarkursen egentligt gælder for alle instanser af klassen.

Hvis din problemstilling indebærer at hver instans skal have sin egen
dollar kurs, så skal løsningen være at du laver en ikke statis dollar
kurs attribut/metode for dine instanser.

vh. ld






DenverDino (20-12-2001)
Kommentar
Fra : DenverDino


Dato : 20-12-01 20:19

Jeg siger tak til alle der gad svare...

...Specielt 'Lars Dam'
det var da utroligt så meget du gad skrive - tak :)

Glædelig Jul til alle!



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste