Avatar billede xsix Nybegynder
06. april 2008 - 15:23 Der er 7 kommentarer og
1 løsning

Non-static method (Nybegynder fejl, tror jeg)

Hej Eksperter.

Jeg er i gang med en skole opgave, og har lidt problemer med det her, jeg har de her 2 classes i samme package som hedder (VRS), og jeg bliver ved med at få denne fejl:
"non-static method calcLateFees(int) cannot be referenced from a static context"

Ved denne linje i Rental.class:
"fee = VRS.Action.calcLateFees(pDaysLate);"

Hvis jeg blot skriver "VRS.Action.", kommer den kun frem og foreslår at jeg kan skrive "class" efter punktumet, og det forstår jeg ikke helt.

Koden:

----------------Rental.class----------------
public double lateFee()
    {
        double fee;
        fee = VRS.Action.calcLateFees(pDaysLate);
        return fee;
    }


----------------Action.class----------------
    public double calcLateFees(int days) {
        double totalfees = 0;
        if(days > 3)
        totalfees = 3 * days;
        return totalfees;
    }
Avatar billede erikjacobsen Ekspert
06. april 2008 - 15:29 #1
Enten gør den nederste static (hvad den kan være i dette tilfælde) eller

public double lateFee()
    {
        double fee;
        VRS.Action a = new VRS.Action();
        fee = a.calcLateFees(pDaysLate);
        return fee;
    }
Avatar billede xsix Nybegynder
06. april 2008 - 16:14 #2
Jeg ændrede den bare så at jeg havde den der calcLateFees, i min Movie class, som så er den jeg extender.
Men bare smid et svar for point alligevel :)
Avatar billede erikjacobsen Ekspert
06. april 2008 - 16:30 #3
Jeg samler slet ikke på point, tak. Svar selv accepter dit eget svar.

Hvis en metode ikke bruger andet, end de parametre den får, så kan (og bør måske) den laves static.
Avatar billede xsix Nybegynder
06. april 2008 - 16:35 #4
Hmm ja det prøvede jeg også på, men kunne ikke helt finde ud af det.
Avatar billede erikjacobsen Ekspert
06. april 2008 - 17:56 #5
public static double calcLateFees(int days) {
Avatar billede xsix Nybegynder
06. april 2008 - 18:45 #6
Ahh ja okay, så langt tænkte jeg ikke lige :P Mange tak :)
Avatar billede jakoba Nybegynder
30. april 2008 - 23:13 #7
Det er et meget almindeligt nybegynder problem. Det du mangler er rigtigt at forstå forskellen på 'static' og 'ikke static'

Du har sikkert til bevidstløshed hørt den der med at når du een har defineret en 'Bil' klasse kan du lave så mange objekter du vil af typen 'Bil'

Det passer, men der er en undtagelse. og den undtagelse er de ting in klassen 'Bil' der bliver erklæret static.

fx:
class Bil {
  public String mærke;
  public static int antalBiler = 0;

  public Bil ( String mærke ) { // constructor metoden
      this.type = mærke;
      antalBiler++;
  }

  //... altmulig andet du vil definere i klassen Bil
}

Bemærk at variablen 'antalBiler' er static. det er de to andre ikke og det gør en gevaldig forskel i hvordan de virker og hvordan de kan bruges.

Så definere du et par Bil objekter

Bil  førsteBil = new Bil( "Ford" );
Bil  andenBil = new Bil( "Toyota" );

For hvert Bil objekt du laver bliver der lavet en ny String variabel ved navn mærke, og den variabel tilhører det Bil objekt du laver netop der.

men den statiske variabel antalBiler er anderledes der eksisterer kun een, og den ene bliver oprettet hvis du bare nævner klassen Bil i dit program. Den bliver lavet selvom du måske ikke opretter et eneste Bil objekt.

Så for at adresserere den behøver du bare at angive klassenavnet Bil.antalBiler.

Men for at addresere den ikke statiske variabel mærke er du nødt til at pege på præcis det Bil objelt den ønskede mærke variabel ligger i
  førsteBil.mærke indeholder "Ford"
  andenBil.mærke indeholder "Toyota"
og hvis du skriver
  Bil.mærke
brokker compileren sig fordi det er jo ikke nok til at forklare hvilken af de oprettede mærke variable du vil have fat i

Og for en sikkerheds skyld brokker den sig også hvis du kalder en ikke-statisk metode, for de kunne jo være at du i den metode refererer til en ikke statisk variabel. Det ville jo gå galt fordi metoden ikke ved hvilken at de oprettede objekter den bliver kaldt i.

mvh JakobA
Avatar billede xsix Nybegynder
01. maj 2008 - 13:34 #8
Mange tak for forklaringen :) Men ja jeg fandt godt ud af det, bare på den "hårde" måde :P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester