vraag over java

Status
Niet open voor verdere reacties.

DennisM

Gebruiker
Lid geworden
2 feb 2007
Berichten
81
Vraag1. Waarom heeft methode main altijd het volgende statement:


new classNaam();

voorbeeld
public static void main( String [] Args]{

new classNaam();
}


Vraag 2. ( komt uit een boek)

public class CoffeeTester{

NiceCoffeeMaker myCoffeMaker;

public static void main ( String [] Args) {
CoffeeTester c = new CoffeeTester ();
c.myCoffeMaker = new NiceCoffeeMaker();

c.myCoffeMaker = brewThisMuch (3);
}


Ik snap niet waarvoor die c is!

We kunnen die c weghalen en het volgende gebruiken:



new CoffeeTester ();
myCoffeMaker = new NiceCoffeeMaker();
myCoffeMaker = brewThisMuch (3);


Het resultaat blijft hetzelfde toch?
 
Vraag1. Waarom heeft methode main altijd het volgende statement:


new classNaam();

voorbeeld
public static void main( String [] Args]{

new classNaam();
}
Dat hoeft niet, dat is nu toevallig zo in een aantal voorbeelden die je hebt gezien. De main methode moet altijd met static void worden aangeroepen zodat je van buiten af een applicatie kan starten. Alles wat in die main mehtode staat verschilt per programma. De constructie zie je wel vaak omdat je op die manier de constructor aanroept van een object die waarschijnlijk centraal staat in je applicatie, maar je kan ook een ander object aanmaken (of geen).

Vraag 2. ( komt uit een boek)

public class CoffeeTester{

NiceCoffeeMaker myCoffeMaker;

public static void main ( String [] Args) {
CoffeeTester c = new CoffeeTester ();
c.myCoffeMaker = new NiceCoffeeMaker();

c.myCoffeMaker = brewThisMuch (3);
}
Ik snap niet waarvoor die c is!

We kunnen die c weghalen en het volgende gebruiken:
new CoffeeTester ();
myCoffeMaker = new NiceCoffeeMaker();
myCoffeMaker = brewThisMuch (3);


Het resultaat blijft hetzelfde toch?
[/code]
Nee de code die je hier plaatst kan niet en om de volgende reden. Normaal kan je een variabele aanmaken van een bepaald objectsoort (officieel genaamd een instantie van een object) dat gaat op de manier:
MijnObject o = new MijnObject();

Dit is het aanroepen van de constructor. Er is dus ergens een klasse met de naam MijnObject en in de huidige code geeft ik aan dat de variabele o van het type MijnObject is. Omdat ik dit aangeeft kan ik variabelen en methoden aanroepen die in dat object zitten, bijvoorbeeld de methode toString().
MijnObject o = new MijnObject();
System.out.println(o.toString());

Wat er zal gebeuren is dat er iets naar het scherm gezegd wordt en de inhoud van het bericht is wat de methode(oftwel een functie) toString() terug geeft. Die o, of c in jouw voorbeeld, heb je nodig om aan te kunnen geven waar je op dat moment over praat. Als je alleen nieuwe objecten zou aanmaken zonder later te kunnen zeggen dat je met dat ene object iets wil doen, heeft het ook weinig nut natuurlijk.


Je weet waarschijnlijk dat een Class methoden en variabelen kan bevatten. Wat je in jouw voorbeeld code doet is het volgende:

CoffeeTester c = new CoffeeTester ();
c.myCoffeMaker = new NiceCoffeeMaker();

eerst maak je een instantie van het object CoffeeTester aan en die instantie noemen we c. Vervolgens is er blijkbaar in de classe CoffeTester een variabele die heet myCoffeMaker want we kunnen die variabele binnen CoffeeTester een nieuwe waarde geven, namelijk dat deze een instantie is van NiceCoffeeMaker.
 
Je weet waarschijnlijk dat een Class methoden en variabelen kan bevatten. Wat je in jouw voorbeeld code doet is het volgende:

CoffeeTester c = new CoffeeTester ();
c.myCoffeMaker = new NiceCoffeeMaker();

eerst maak je een instantie van het object CoffeeTester aan en die instantie noemen we c. Vervolgens is er blijkbaar in de classe CoffeTester een variabele die heet myCoffeMaker want we kunnen die variabele binnen CoffeeTester een nieuwe waarde geven, namelijk dat deze een instantie is van NiceCoffeeMaker.

myCoffeMaker is een variabele in de class CoffeTester. Dus waarom moeten we binnen de class "CoffeTester" een object van het type "CoffeTester" maken om een variabele in dezelfde class aan te roepen of te gebruiken.
Er is maar in variabele in de class die myCoffeMaker heet. Dus ik hoef geen object te maken om deze variabele aan te roepen. De compiler weet dat ik die ene variabele bedoel.

Veerbeeld:

Class A{
int b;
A a = new A();
A(){
b =2;
// a.b= 2; dit hoeft toch niet
}

}

Hier hoef ik geen object van A te maken om de variabele b een waarde te geven. Waarom in het eerste voorbeeld ( myCoffeMaker) wel?
 
Dat weet hij niet. Je kan namelijk wel 100 verschillende instanties maken van CoffeeTester

CoffeeTester c1 = new CoffeeTester();
CoffeeTester c2 = new CoffeeTester();
CoffeeTester c3 = new CoffeeTester();
c2.myCoffeMaker = 3;

Nu weet hij tenminste dat in de instantie c2 van het object CoffeeTester de waarde 3 moet krijgen. Zou ik die c2 niet gebruiken dan kan hij onmogelijk weten waar die myCoffeeMaker vandaan moet komen en ook niet welke instantie van die klasse die waarde moet krijgen.

Daarnaast zijn er misschien wel meerdere klasses die die variabelenaam gebruiken. Misschien zit hij ook wel in de klasse Pietje?
 
Laatst bewerkt:
Dat weet hij niet. Je kan namelijk wel 100 verschillende instanties maken van CoffeeTester

CoffeeTester c1 = new CoffeeTester();
CoffeeTester c2 = new CoffeeTester();
CoffeeTester c3 = new CoffeeTester();
c2.myCoffeMaker = 3;

Nu weet hij tenminste dat in de instantie c2 van het object CoffeeTester de waarde 3 moet krijgen. Zou ik die c2 niet gebruiken dan kan hij onmogelijk weten waar die myCoffeeMaker vandaan moet komen en ook niet welke instantie van die klasse die waarde moet krijgen.

Daarnaast zijn er misschien wel meerdere klasses die die variabelenaam gebruiken. Misschien zit hij ook wel in de klasse Pietje?



Het blijft vaag! Ben je een Java ontwikkelaar?

De compiler gaat de variabele myCoffeMaker niet zoeken in de class Pietje. De compiler zoekt de variabele eerst in de class CoffeeTester en hij vindt hem. Het is dus wel mogelijk om te weten waar myCoffeMaker vandaan komt.

De variabele myCoffeMaker van de class CoffeTester wordt in dezelfde class aangeroepen met:
myCoffeTester = 3.

De variabele myCoffeMaker van de class Pietje wordt in de class CoffeTester aangeroepen met:

Pietje p = new Pietje();
p.myCoffeTester = 3;
 
Ik ben geen professionele ontwikkelaar, maar heb tijdens mijn studie een aardige portie Java meegekregen.

De compiler gaat de variabele myCoffeMaker niet zoeken in de class Pietje. De compiler zoekt de variabele eerst in de class CoffeeTester en hij vindt hem. Het is dus wel mogelijk om te weten waar myCoffeMaker vandaan komt.
Dit kan inderdaad wanneer je de code in de classe CoffeeTester zelf zet. Dit zal ik duidelijk maken aan de hand van het volgende voorbeeld:

Code:
public class CoffeeTester {
\\hier staan eventuele import statements

  public NiceCoffeeMaker myCoffeeTester;

  public CoffeeTester() {
  }

  public void doeIets() {
     CoffeeTester c = new CoffeeTester ();
     c.myCoffeeMaker = new NiceCoffeeMaker();
     myCoffeeMaker = new NiceCoffeeMaker();
  }
}
Wat hier staat is een werkende code. We hebben een klasse CoffeeTester die een variabele bevat genaamd myCoffeeTester. Wanneer de methode doeIets() wordt aangeroepen dan zal deze methode eerst een nieuwe CoffeeTester aanmaken (dus op dat moment heb je 2 instanties van de class CoffeeTester in je omgeving draaien). De tweede instantie van die CoffeeTester is aan te roepen via de lokale variabele c. In de tweede regel van de methode krijgt de variabele myCoffeeMaker van de instantie c een nieuwe waarde meegegeven. In de derde regel krijgt de variabele van de huidige instantie ook een nieuwe waarde. Het verschil tussen de 2 regels ligt dus welke variabele wordt aangepast. Van de huidige instantie of van een andere instantie.

Overigens een ander leuk punt is dat de instantie van c verdwijnt zodra doeIets() is afgerond, omdat c binnen die methode is aangemaakt.en dus een lokale variabele is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan