Archief - [JAVA] Static reference in a non-static method

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

BilboBaggins

Legacy Member
Ik zit met het volgende probleem:

Ik heb een klasse Auto en klasse Garage
In mijn klasse auto is helemaal non-static.

In mijn klasse Garage heb ik nu een methode waarmee ik een variabele van een object van de klasse Auto wil veranderen.
De methode in Garage is echter een static methode en zodus de fout: Cannot make a static reference in a non-static method...

De methoden van de klasse Auto static maken is geen optie.
Kunnen jullie me verder helpen?

forloRn_

Legacy Member
Op het eerste zicht gaat het static maken van de methods van Auto ook niets oplossen, maar ik kan je uitleg niet goed volgen. Heeft een Garage een member variabele van het type Auto?

Plak die klassen hier eens.

BilboBaggins

Legacy Member
Code:
import java.util.*;

public class Auto {
	
	private ArrayList<String> eigenaars;
	private String merk;
	
	public Auto(String merk)
	{
		this.merk = merk;
		eigenaars = new ArrayList<String>();
		
	}
	
	public boolean voegEigenaarToe(String eigenaar)
	{
		boolean hulp = true;
		for(int i = 0; i < eigenaars.size()&& hulp; i++)
		{
			if(eigenaar.equals(eigenaars.get(i)))
			{
				hulp = false;
			}
		}
		if(hulp)
		{
			eigenaars.add(eigenaar);
		}
		return hulp;
	}
}

Code:
public class Garage {
	
	String naam;
	
	
	public Garage(String naam)
	{
		setNaam(naam);
	}
	
	public String getNaam()
	{
		return naam;
	}
	
	public void setNaam(String naam)
	{
		this.naam = naam;
	}
	
	public static boolean voegEigenaars(String naam)
	{
		return Auto.voegEigenaarToe(naam);
	}

}

het gaat het om die laatste methode.

Jerre Muesli

Legacy Member
Nogal wiedes hè, de methode 'voegEigenaarToe' van de klasse Auto is niet static.
En nadien ga je wss een fout krijgen dat "private ArrayList<String> eigenaars;" niet static is in Auto.

forloRn_

Legacy Member
Waarom wil je die method per sé static maken? Die loop in Auto.voegEigenaarToe() kan je trouwens vervangen door:
Code:
if (!eigenaars.contains(eigenaar)) { ... }

Jerre Muesli

Legacy Member
Het is een heel verkeerd gebruik van static. Static is voor utility methods. Jij wil de field eigenaars aanpassen in een static method!?
Je wil waarschijnlijk gewoon een object auto meegeven zoals dit:

Code:
public boolean voegEigenaars(String naam, Auto auto)
	{
		return auto.voegEigenaarToe(naam);
	}

MilM

Legacy Member
BilboBaggins zei:
Dat was één van de opdrachten :unsure:
Ik zou een eigenaar moeten kunnen toevoegen.

Ik ken de opgave niet, maar wat jij nu doet is volledig verkeerd.

Als je een eigenaar wil toevoegen aan een wagen, waarom maak je dan nog een methode in de klasse 'Garage' ? Ik vermoed dat je zoals x4xk3 zegt een auto object moet meegeven, maar dan nog is dit niet echt proper, want waarom zou je dan niet direct de methode op het auto object oproepen ipv via de Garage klasse te werken.

Post eens uw opgave. Mss heb je de opgave verkeerd begrepen?

forloRn_

Legacy Member
Nu ja, nu het misloopt, word je tenminste gedwongen om eens te kijken wat static precies wilt zeggen.

Het probleem is niet echt dat Garage.voegEigenaars() static is, het probleem is dat Auto.voegEigenaarToe() dat níet is, terwijl je het wel oproept als een static method. Je wilt een auto een eigenaar geven, maar wélke auto? x4xk3 heeft de oplossing al gegeven.

MilM

Legacy Member
Ik zou toch eens de opgave posten, want als dat de bedoeling is, dan is die leraar toch enorm verkeerd bezig.

Je kunt zo setters als statische methodes gaan zetten in andere klasses.
Bv in de Auto garage dit gaan zetten, wat op niets slaat uiteindelijk.

Code:
public static void changeNameGarage(String name, Garage garage)
	{
		garage.setName(naam);
	}

eniac

Legacy Member
Ik vind het ook wat raar om met die boolean te werken die moet aangeven of het de eigenaar effectief toegevoegd is of niet.

Kemblin

Legacy Member
Nu we toch bezig zijn, uw voegEigenaarToe methode is ook nogal omslachtig, je kan ook gewoon zoiets doen:

Code:
for(int i = 0; i < eigenaars.size(); i++)
	if(eigenaar.equals(eigenaars.get(i)))
		return false;	

eigenaars.add(eigenaar);
return true;

Cycloon

Legacy Member
Kemblin zei:
Nu we toch bezig zijn, uw voegEigenaarToe methode is ook nogal omslachtig, je kan ook gewoon zoiets doen:

Code:
for(int i = 0; i < eigenaars.size(); i++)
	if(eigenaar.equals(eigenaars.get(i)))
		return false;	

eigenaars.add(eigenaar);
return true;

Om het eens over slecht geschreven code te hebben. De originele code was dan iets beter, alhoewel hij daar een while moet gebruiken ipv een for.

Ice

Legacy Member
Kemblin zei:
Nu we toch bezig zijn, uw voegEigenaarToe methode is ook nogal omslachtig, je kan ook gewoon zoiets doen:

Code:
for(int i = 0; i < eigenaars.size(); i++)
	if(eigenaar.equals(eigenaars.get(i)))
		return false;	

eigenaars.add(eigenaar);
return true;

Ja SUPER .... Want goh een collectie waar geen duplicaten in mogen zitten is zo speciaal dat het niet in java zit ... oh wacht ... Set (Java 2 Platform SE v1.4.2)

Kemblin

Legacy Member
Ice zei:
Ja SUPER .... Want goh een collectie waar geen duplicaten in mogen zitten is zo speciaal dat het niet in java zit ... oh wacht ... Set (Java 2 Platform SE v1.4.2)

ik ging er vanuit dat ie wel degelijk specifiek een ArrayList nodig had...

Cycloon zei:
Om het eens over slecht geschreven code te hebben. De originele code was dan iets beter, alhoewel hij daar een while moet gebruiken ipv een for.

waarom?

Ice

Legacy Member
Kemblin zei:
ik ging er vanuit dat ie wel degelijk specifiek een ArrayList nodig had...



waarom?

Hij heeft een lijst nodig waarin de elementen uniek zijn. (Volgens zijn code toch) en dan is ArrayList toch een foute keuze.

Kemblin

Legacy Member
Ice zei:
Hij heeft een lijst nodig waarin de elementen uniek zijn. (Volgens zijn code toch) en dan is ArrayList toch een foute keuze.

tjah das waar, ne set had mss idd beter geweest, maar misschien was de volgorde van eigenaars voor hem wel van belang ?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan