Toon posts:

[java]non-static methodes from static context

Pagina: 1
Acties:

Onderwerpen


  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 29-05 14:15
Er is een probleem waar ik al een lange tijd tegenaanloop: static methodes en classes. De vraag:
Ik heb een main class, met een main method. Vervolgens maak ik een nieuwe, non static class met daarin een non-static method a.

Dan doe ik in de mainclass

class a = new class();
a.a();

Op dat moment krijg ik een error: non-static method a cannot be referenced from a static context. Dus dan maak ik van a een static method, maar dat voelt een beetje als een vieze oplossing, ook is deze soms gewoon onmogelijk (non-static java native methods). Wat is de schone manier om dit op te lossen?

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Kan je een wat groter / beter codevoorbeeldje geven? :)

Je zou natuurlijk gewoon non-static methods moeten kunnen aanroepen op een object :)

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 29-05 14:15
code:
1
2
3
4
5
6
7
8
9
package Main;

public class Main {

    public static void main(String[] args) {
       Hoi hoi = new hoi();
       hoi.hallo();
    }
}

Dit is de main
Java:
1
2
3
4
5
6
7
public class Hoi {

    public void hallo() {
       System.out.println("Hallieu");
    }

    }

De andere class

Dit mag dus niet, want hallo is niet static. Dan maak ik daar maar public static void hallo van, maar soms gaat dat dus gewoon niet (kan even geen java non-static native method verzinnen, maar ze bestaan zeker.)

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 20-04 19:15
KillerZero86 schreef op maandag 20 juni 2011 @ 13:23:
code:
1
2
3
4
5
6
7
8
9
package Main;

public class Main {

    public static void main(String[] args) {
       Hoi hoi = new hoi();
       hoi.hallo();
    }
}

Dit is de main
Java:
1
2
3
4
5
6
7
public class Hoi {

    public void hallo() {
       System.out.println("Hallieu");
    }

    }

De andere class

Dit mag dus niet, want hallo is niet static. Dan maak ik daar maar public static void hallo van, maar soms gaat dat dus gewoon niet (kan even geen java non-static native method verzinnen, maar ze bestaan zeker.)
In principe zou het gewoon moeten mogen hoor. Check eens de hoofdletters van je class en je variabele. Noem bijvoorbeeld je variabele eens myVar of tempHoi of iets wat in ieder geval afwijkt van je class.

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • - peter -
  • Registratie: September 2002
  • Laatst online: 14:51
Weet je idd zeker dat je niet per ongeluk hem statisch aanroept?

bijv:

code:
1
Hoi.hallo()

ipv

code:
1
hoi.hallo()

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 29-05 14:15
Praktijkvoorbeeld:

Java:
1
2
3
4
5
6
7
8
9
10
11
package Main;

public class Eject {

    public static void main(String[] args) {
        int[] hoi = {1,1,1};
        UitgaveBriefjes uitgeven = new UitgaveBriefjes();
        UitgaveBriefjes.uitgave(hoi);

    }
}

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Main;

import Lejos.StartProgram;

public class UitgaveBriefjes extends Thread {

    public void uitgave(int[] briefjes) {
        int p = 13000;
        StartProgram x = new StartProgram();
        for (int i = 1; i <= briefjes[0]; i++) {
            x.starten("Vijftig.nxj");
            wacht(p);
        }
        for (int i = 1; i <= briefjes[1]; i++) {
            x.starten("Twintig.nxj");
            wacht(p);
        }
        for (int i = 1; i <= briefjes[2]; i++) {
            x.starten("Tien.nxj");
            wacht(p);
        }
        x.starten("Draaien.nxj");
    }

    public static void wacht(int n) {
        long t0, t1;
        t0 = System.currentTimeMillis();
        do {
            t1 = System.currentTimeMillis();
        } while (t1 - t0 < n);
    }
}


NetBeans tekent nu een prachtige vette rode streep onder UitgaveBriefjes.uitgave(hoi);, met eerder genoemde fout. Als jij zegt dat de vorige perfect zou moeten gaan, waarom gaat deze dan niet goed?

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 20-04 19:15
KillerZero86 schreef op maandag 20 juni 2011 @ 13:28:
Praktijkvoorbeeld:

Java:
1
2
3
4
5
6
7
8
9
10
11
package Main;

public class Eject {

    public static void main(String[] args) {
        int[] hoi = {1,1,1};
        UitgaveBriefjes uitgeven = new UitgaveBriefjes();
        UitgaveBriefjes.uitgave(hoi);

    }
}

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Main;

import Lejos.StartProgram;

public class UitgaveBriefjes extends Thread {

    public void uitgave(int[] briefjes) {
        int p = 13000;
        StartProgram x = new StartProgram();
        for (int i = 1; i <= briefjes[0]; i++) {
            x.starten("Vijftig.nxj");
            wacht(p);
        }
        for (int i = 1; i <= briefjes[1]; i++) {
            x.starten("Twintig.nxj");
            wacht(p);
        }
        for (int i = 1; i <= briefjes[2]; i++) {
            x.starten("Tien.nxj");
            wacht(p);
        }
        x.starten("Draaien.nxj");
    }

    public static void wacht(int n) {
        long t0, t1;
        t0 = System.currentTimeMillis();
        do {
            t1 = System.currentTimeMillis();
        } while (t1 - t0 < n);
    }
}


NetBeans tekent nu een prachtige vette rode streep onder UitgaveBriefjes.uitgave(hoi);, met eerder genoemde fout. Als jij zegt dat de vorige perfect zou moeten gaan, waarom gaat deze dan niet goed?
Je moet de functie dan ook aanroepen op uitgeven en niet op UitgaveBriefjes. UitgaveBriefjes is je class en daar kun je alleen static members op aanroepen. uitgegeven is je object, daar kun je de non-statics op uitvoeren. Je code moet dus worden:

Java:
1
2
3
4
5
6
 public static void main(String[] args) {
        int[] hoi = {1,1,1};
        UitgaveBriefjes uitgeven = new UitgaveBriefjes();
        uitgeven.uitgave(hoi);

    }

Compilen, runnen en klaar :P

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • HectorGert
  • Registratie: Februari 2011
  • Laatst online: 25-12-2022
Volgens mij is het aanroepen van methodes in een main sowieso niet erg schoon. Waarom roep je die methode dan niet aan in de constructor van 'Hoi'?

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 29-05 14:15
Ah, dat is eht, gewoon weer een typfoutje. Weer een opheldering, bedankt jongens!

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 20-04 19:15
HectorGert schreef op maandag 20 juni 2011 @ 13:37:
Volgens mij is het aanroepen van methodes in een main sowieso niet erg schoon. Waarom roep je die methode dan niet aan in de constructor van 'Hoi'?
Waarom zou je dat in de constructor doen? Er staan wait statements in, lijkt me niet echt netjes om in de constructor te doen. De array kan hij wel meegegeven in de constructor en dan opslaan in het object, maar een hoop logica in de constructor uitvoeren is helemaal niet netjes :X

Zou wel netjes zijn om de array mee te geven en dan de functie aan te roepen (zonder parameters), maar ook dat is weer erg afhankelijk van de situatie (onder andere wat het doel van je array is).

Daarbij komt dat er ook fouten/exceptions kunnen optreden, dat wil je helemaal niet in een constructor.
KillerZero86 schreef op maandag 20 juni 2011 @ 13:38:
Ah, dat is eht, gewoon weer een typfoutje. Weer een opheldering, bedankt jongens!
Typefout? Denk eerder copy-paste fout :P Of je ben iets te enthousiast geweest in de codecompletion :P

[Voor 15% gewijzigd door .Gertjan. op 20-06-2011 13:40]

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • HectorGert
  • Registratie: Februari 2011
  • Laatst online: 25-12-2022
.Gertjan. schreef op maandag 20 juni 2011 @ 13:39:
[...]


Waarom zou je dat in de constructor doen? Er staan wait statements in, lijkt me niet echt netjes om in de constructor te doen. De array kan hij wel meegegeven in de constructor en dan opslaan in het object, maar een hoop logica in de constructor uitvoeren is helemaal niet netjes :X

Zou wel netjes zijn om de array mee te geven en dan de functie aan te roepen (zonder parameters), maar ook dat is weer erg afhankelijk van de situatie (onder andere wat het doel van je array is).

Daarbij komt dat er ook fouten/exceptions kunnen optreden, dat wil je helemaal niet in een constructor.


[...]

Typefout? Denk eerder copy-paste fout :P Of je ben iets te enthousiast geweest in de codecompletion :P
Mijn excuses, ik keek naar het Hoi voorbeeld i.p.v. het Uitgavebriefjes voorbeeld.

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 20-04 19:15
HectorGert schreef op maandag 20 juni 2011 @ 13:46:
[...]


Mijn excuses, ik keek naar het Hoi voorbeeld i.p.v. het Uitgavebriefjes voorbeeld.
Over het nut van dat voorbeeld valt sowieso te discussiëren :D Een class die alleen tegen je praat in de console heb je in de praktijk niet zo heel veel aan :P

Overigens zou ik dat daar ook niet in de constructor doen. Constructor is het opbouwen van het object aan de hand van meegegeven of standaard data. Daarin hoort zo goed als geen logica thuis.

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • HectorGert
  • Registratie: Februari 2011
  • Laatst online: 25-12-2022
.Gertjan. schreef op maandag 20 juni 2011 @ 13:49:
[...]

Over het nut van dat voorbeeld valt sowieso te discussiëren :D Een class die alleen tegen je praat in de console heb je in de praktijk niet zo heel veel aan :P

Overigens zou ik dat daar ook niet in de constructor doen. Constructor is het opbouwen van het object aan de hand van meegegeven of standaard data. Daarin hoort zo goed als geen logica thuis.
Ligt maar net wat er in de methode staat, misschien staat er wel opbouwlogica in. Maar dit voorbeeld is inderdaad nogal niets zeggend om over de implementatie iets zinnigs te kunnen melden.

Anoniem: 145681

Dat zou volgens mij niet eens door de compiler geraken. Je
Java:
1
new hoi()

zal toch op zijn minst
Java:
1
new Hoi()

moeten zijn
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee