Toon posts:

[java]nonstatic method cant be referenced frm static context

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

Voor school hebben we een opdracht waarbij we in java (m.b.v. bluej) een soort zeeslag moeten maken. In een klasse "ships" maak ik boten aan, elk bestaande uit 3 positie objecten (boten bestaan steeds uit 3 vakjes, posities, aan elkaar, horizontaal of verticaal). In een klasse "Shoot" controleer ik of een bepaalde gekozen positie (de positie waarop geschoten wordt) gelijk is aan een positie van een stukje boot. (als dat zo is, is het raak). De lijst met positie objecten wordt in de klasse ships aangemaakt met een while lus. Afhankelijk van het aantal boten, is deze lijst (ArrayList btw) dus groter of kleiner. Nu heb ik echter deze lijst ook nodig in mijn klasse "Shoot" om dus die hitdetectie te kunnen uitvoeren. Echter als ik een methode schrijf in ship die de lijst (met de positie objectenà returned, en deze methode oproep in "Shoot", krijg ik de melding

non-static method cannot be referenced from a static context.

Nu weet ik wel wat dit betekend ongeveer, die lijst met positieobjecten is niet statisch omdat die in een while lus wordt aangemaakt en als ik dezelfde lijst in "shoot" wil gebruiken, moet deze wel statisch zijn. Ik heb al zitte prutsen met "public static" methodes etc, maar het mocht niet baten. Via google kom ik er ook niet zo 1, 2, 3 uit. Het is trouwens nog maar sinds kort dat we met java werken.

Weet er hier iemand een eenvoudige work around?

verhaal in het kort:
-in klasse "ships" wordt een lijst d.m.v. een while lus aangemaakt,
-deze lijst wil ik ook kunnen gebruiken in klasse "shoot", maar dan krijg ik dus bovenstaande error.

EDIT:

oh ja, via google leek het meest bruikbare advies om een instantie aan te maken van die klasse en het zo te gebruiken, maar dat is hier niet echt handig (alles behalve zelfs).


BVD :)

[ Voor 5% gewijzigd door Verwijderd op 10-03-2009 22:06 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je zit dus momenteel in een static context. Probeer daar uit te komen zou ik zeggen, dan is je probleem voorbij.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Aanvulling: Google heeft gelijk ;).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HuHu schreef op dinsdag 10 maart 2009 @ 22:06:
Je zit dus momenteel in een static context. Probeer daar uit te komen zou ik zeggen, dan is je probleem voorbij.
bedankt voor de snelle reply, maar kun je me een beetje de juist weg op sturen? Moet ik met "public static" etc gaan spelen of moet ik ergens anders gaan zoeken?

ik ga iig nog wat verder proberen met een instantie aan te maken van ship maar zoals mijn edit zegt is dat hier niet echt triviaal.
HuHu schreef op dinsdag 10 maart 2009 @ 22:06:
Aanvulling: Google heeft gelijk ;).
ok, dan zoek ik wat verder, ik post mijn results wel :)

[ Voor 16% gewijzigd door Verwijderd op 10-03-2009 22:08 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Welke methode zit je nu in dan? Ik vermoed in public static void main(String args[]). Die methode is inderdaad static, verplicht zelfs, dus van daaruit kun je geen dingen doen.

Wat je daarin wel kunt doen is een instantie aanmaken van je klasse en van daaruit dan je methoden aan te roepen.

Java:
1
2
3
4
public static void main(String args[])
{
  new ZeeSlag();
}


Je ZeeSlag() constructor maakt vervolgens de layout van je programmaatje en reageert op user-input.

Acties:
  • 0 Henk 'm!

  • Mattijsken
  • Registratie: Juni 2008
  • Laatst online: 10:08
Hé , dit ken ik :) ! 1ste bac ingenieur KUL misschien? ;)

Dit hadden wij dus ook. Wat je nu doet is direct op de klasse de methode toepassen (Ship.methode doe je nu, wat inderdaad een statische methode is). Als je overal de ArrayList wilt hebben, moet je die inderdaad wel statisch maken, anders gaat elk object van de klasse ship zelf een nieuwe ArrayList aanmaken, en je wil net dezelfde ArrayList overal gebruiken. Dus gewoon "static" zetten bij de variabele van ArrayList. En dan de return-methode ook static maken, natuurlijk.

Het zou best kunnen dat elke echte Java-programmeur nu spontaan een hartaanval krijgt als hij dit leest, maar zo hebben wij het gedaan en het werkt.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Mattijsken schreef op dinsdag 10 maart 2009 @ 22:19:
Hé , dit ken ik :) ! 1ste bac ingenieur KUL misschien? ;)

Dit hadden wij dus ook. Wat je nu doet is direct op de klasse de methode toepassen (Ship.methode doe je nu, wat inderdaad een statische methode is). Als je overal de ArrayList wilt hebben, moet je die inderdaad wel statisch maken, anders gaat elk object van de klasse ship zelf een nieuwe ArrayList aanmaken, en je wil net dezelfde ArrayList overal gebruiken. Dus gewoon "static" zetten bij de variabele van ArrayList. En dan de return-methode ook static maken, natuurlijk.

Het zou best kunnen dat elke echte Java-programmeur nu spontaan een hartaanval krijgt als hij dit leest, maar zo hebben wij het gedaan en het werkt.
Dat doe je dus niet door het maar statisch te maken, maar dan doe je zoiets: in de klasse ships zit de lijst ArrayList ships. Maak je een mooie methode public ArrayList getShips() { return ships; }. In je klasse Shoot doe je dan: Ships ships = new Ships(); ArrayList shipList = ships.getShips(); enz...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HuHu schreef op dinsdag 10 maart 2009 @ 22:10:
Welke methode zit je nu in dan? Ik vermoed in public static void main(String args[]). Die methode is inderdaad static, verplicht zelfs, dus van daaruit kun je geen dingen doen.

Wat je daarin wel kunt doen is een instantie aanmaken van je klasse en van daaruit dan je methoden aan te roepen.

Java:
1
2
3
4
public static void main(String args[])
{
  new ZeeSlag();
}


Je ZeeSlag() constructor maakt vervolgens de layout van je programmaatje en reageert op user-input.
zo heb ik het gedaan denk ik :) , ik gebruik een object van de klasse ship en roep de methodes daarvan aan. Dat lijkt zo te werken, nog niet helemaal correct, maar dat komt door de code van de klasse shoot lijkt mij.
Mattijsken schreef op dinsdag 10 maart 2009 @ 22:19:
Hé , dit ken ik :) ! 1ste bac ingenieur KUL misschien? ;)

Dit hadden wij dus ook. Wat je nu doet is direct op de klasse de methode toepassen (Ship.methode doe je nu, wat inderdaad een statische methode is). Als je overal de ArrayList wilt hebben, moet je die inderdaad wel statisch maken, anders gaat elk object van de klasse ship zelf een nieuwe ArrayList aanmaken, en je wil net dezelfde ArrayList overal gebruiken. Dus gewoon "static" zetten bij de variabele van ArrayList. En dan de return-methode ook static maken, natuurlijk.

Het zou best kunnen dat elke echte Java-programmeur nu spontaan een hartaanval krijgt als hij dit leest, maar zo hebben wij het gedaan en het werkt.
thnx, jouw methode ga ik ook eens proberen, maar ik denk dat ik al zo'n poging had gedaan en dat het niet echt lukte, iig proberen kan nooit kwaad.

idd, 1e bac, BI KUL, B2 :)

Acties:
  • 0 Henk 'm!

  • redfox314
  • Registratie: December 2004
  • Laatst online: 20-09 22:40
Op een iets hoger niveau... Volgens mij heb je het verschil tussen een klasse en een instance van een klasse niet door. Daaraan is de betekenis van het keyword static verbonden. Normaal gezien zou je dat in je cursusmateriaal moeten kunnen vinden. Maar als de burgies in Leuven even hard aan hun lot worden overgelaten met programmeren als hier in Antwerpen dan moet je maar eens googelen.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 02:56

Nick_S

++?????++ Out of Cheese Error

HuHu schreef op dinsdag 10 maart 2009 @ 22:25:
[...]

Dat doe je dus niet door het maar statisch te maken, maar dan doe je zoiets: in de klasse ships zit de lijst ArrayList ships. Maak je een mooie methode public ArrayList getShips() { return ships; }. In je klasse Shoot doe je dan: Ships ships = new Ships(); ArrayList shipList = ships.getShips(); enz...
Geef nooit meer informatie dan nodig is naar buiten je klasse toe.
Java:
1
public ArrayList getShips() { return ships; }


Zou ik veranderen in:
Java:
1
public List getShips() { return ships; }


Na een beetje verder kijken (List staat duplicates toe en is ordered, iets wat je volgens mij allebei niet nodig hebt) zou je dit zelfs kunnen veranderen in een Set (geen duplicates, geen order) of zelfs een Iterable (Zegt niets over duplicates of ordering.

Werken jullie nog met Java 1.4 of met 1.5? Dan komen zelfs generics nog om de hoek kijken.

Verder geef je nooit een wijzigbare collectie terug, (Data encapsulatie) dus
Java:
1
public Set<Ship> getShips() { return Collections.unmodifiableSet(ships); }

Is denk ik (afgaande op je requirements) de meest voor de hand liggende oplossing.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt, ik zal het eens proberen. Mijn methodes zijn wel wat anders omdat een Ship object bestaat uit 3 position objecten en een Set van ships is daarom niet echt wenselijk voor mij denk ik aangezien ik moet controleren of er raak of mis geschoten wordt op een stukje van het schip.

mijn constructor van shoot ziet er zo uit:

Java:
1
2
3
4
5
public Shoot(int numberOfShips, UserInterface userInterface, Ships ship) {
...
this.ship = ship;
...
}


EDIT: trouwens, dat werkt, maar als er betere manieren zijn kan het natuurlijk nooit kwaad die uit te proberen :)

[ Voor 11% gewijzigd door Verwijderd op 11-03-2009 07:59 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Nick_S schreef op woensdag 11 maart 2009 @ 02:44:
[...]

Geef nooit meer informatie dan nodig is naar buiten je klasse toe.
Java:
1
public ArrayList getShips() { return ships; }


Zou ik veranderen in:
Java:
1
public List getShips() { return ships; }


Na een beetje verder kijken (List staat duplicates toe en is ordered, iets wat je volgens mij allebei niet nodig hebt) zou je dit zelfs kunnen veranderen in een Set (geen duplicates, geen order) of zelfs een Iterable (Zegt niets over duplicates of ordering.

Werken jullie nog met Java 1.4 of met 1.5? Dan komen zelfs generics nog om de hoek kijken.

Verder geef je nooit een wijzigbare collectie terug, (Data encapsulatie) dus
Java:
1
public Set<Ship> getShips() { return Collections.unmodifiableSet(ships); }

Is denk ik (afgaande op je requirements) de meest voor de hand liggende oplossing.
Dat soort dingen komen wel aan bod als ze de basis eenmaal snappen. Het heeft geen enkel nut om een unmodifiableSet terug te geven op het moment dat je nog niet eens snapt waar die methode voor dient, of het grote "waarom" nog niet kunt beantwoorden.

Je kunt het wel moeilijker gaan maken dan het is, maar dat lijkt me niet handig.

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 24-08 06:41
@Huhu helemaal mee eens. Laat ze nu eerst de basics eens snappen voordat je de complexere zaken behandeld. En een boek/website m.b.t. java en object georienteerd programeren kan ik echt aanraden. Statics hebben jullie niet echt nodig (alleen natuurlijk de public static main methode).

Better to remain silent and be thought a fool then to speak out and remove all doubt.

Pagina: 1