Toon posts:

java: Methode uit andere class aanroepen?

Pagina: 1
Acties:
  • 2.845 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Dag mensen.

Ik ben bezig met een project voor school. We moeten een spel maken. Een soort van MUD.

Ik heb nu een class Donjon. Laat maar zeggen de hoofdclass van het spel. Deze mag maar 1x aangeroepen worden.
In deze class maak ik een object speelbaarSpelfiguur aan. Deze gooi ik in een Vector.

Nu wil ik in een andere class (zowel op server als Client, dus in verschillende classes)
een methode aanroepen om het object uit die vector uit te lezen.

public Vector getVector()
{
return vSpeelbaarSpelfiguur;
}

Deze wil ik dus aanroepen in een andere class. Hoe doe ik dit zonder Donjon opnieuw te initialiseren?
Dus dit wil ik niet:

private Donjon donjon;

donjon = new Donjon;

donjon.getVector();

Want dan wordt donjon opnieuw aangemaakt/geinitialiseerd. En dat mag alleen maar gebeuren als de server wordt gestart.

alvast bedankt

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat jij een singleton class bedoelt. Dit is een class die maar 1 keer aangemaakt wordt, zodat iedereen dezelfde instantie heeft.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Donjon
{
    private static Donjon instance = null;
    
    public static Donjon getInstance()
    {
        if(donjon == null)
            donjon = new Donjon();
            
        return donjon;  
    }
    
    private Donjon()
    {
    
    }
}

Als je gebruik wilt maken van deze class kun je gewoon het volgende doen..
code:
1
2
3
4
5
6
7
class A 
{
    public void doIets()
    {
        Donjon.getInstance().doNogMeer();
    }
}

En jij wilt aan de client kant ook gebruik maken van dit object? Dan zou ik eens kijken naar RMI en niet proberen het object over te sturen. De client kan dan met het object op de server communiceren zonder dat dat object bij de server vandaan gaat. Ik vond je verhaal eerlijk gezegd behoorlijk onduidelijk, misschien kun je het iets duidelijker maken?server vandaan gaat.

[algemene opmerking]heeft iedereen last van die vervelende editor? Als je voor de 2e keer je text gaat wijzigen, dan is de 1e wijziging niet zichtbaar. Erg vervelend. Zal wel bij de vooruitgang horen, nieuwe functionaliteit wat je niet nodig hebt, en oude functionaliteit verdwijnt.

Verwijderd

Topicstarter
De eigenlijke vraag is misschien wat simpeler:

Hoe kan ik van een Class (bijv donjon) een methode aanroepen in andere classes (bijv teken en test) zonder in elke class waar ik die methode aanroep de class waar die methode in staat (donjon)te initialiseren.

Dus ik wil een methode van Donjon aanroepen in bijvoorbeeld de class Teken.
zonder te moeten zeggen:

Donjon donjon = new Donjon
donjon.methode()

Want elke keer dat ik donjon opnieuw aanmaak (new Donjon) zet ie alles op null. En dat wil ik niet. (Dit geld voor nog meer methodes uit andere classes.)

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Je bedoelt een klasse die in andere klassen meteen "toegankelijk" is (kwa methoden) zonder dat je steeds een nieuwe klasse instantieert?

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Topicstarter
Op donderdag 29 november 2001 17:44 schreef Alarmnummer het volgende:
Ik denk dat jij een singleton class bedoelt. Dit is een class die maar 1 keer aangemaakt wordt, zodat iedereen dezelfde instantie heeft.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Donjon
{
    private static Donjon instance = null;
    
    public static Donjon getInstance()
    {
        if(donjon == null)
            donjon = new Donjon();
            
        return donjon;  
    }
    
    private Donjon()
    {
    
    }
}

Als je gebruik wilt maken van deze class kun je gewoon het volgende doen..
code:
1
2
3
4
5
6
7
class A 
{
    public void doIets()
    {
        Donjon.getInstance().doNogMeer();
    }
}
Heb het geprobeerd en werkt perfect :)
Onwijs bedankt..

Verwijderd

Topicstarter
Op donderdag 29 november 2001 18:12 schreef limoentje het volgende:
Je bedoelt een klasse die in andere klassen meteen "toegankelijk" is (kwa methoden) zonder dat je steeds een nieuwe klasse instantieert?
jep.. dat bedoel ik.. Bedankt voor de goeie verwoording (ben ik nooit zo goed in :s)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Wat jij wilt is inderdaad perfect een Singleton.

Jouw probleem is eigenlijk als volgt: Je wilt een object (= instantie van een klasse) overal beschikbaar hebben. Je kan dan een aantal dingen doen:

1. Als er altijd maar 1 object is:
a) alles static maken -> slechte oplossing
b) een Singleton gebruiken -> mooie oplossing

2. Als er toch weleens meerdere instanties mogelijk zouden kunnen zijn -> object meegeven naar de klassen die hem nodig hebben.

Ik gebruik zelf eigenlijk niet zo vaak meer een Singleton die al gelijk als Singleton in de klasse zelf is gedefinieerd. Het kan namelijk nog weleens voorkomen dat je toch ergens een tweede of derde instantie wil aanmaken. Daarom werk ik tegenwoordig vaak met een soort van 'Environments' die ik meegeef aan de klassen die ze nodig hebben. Deze environments bevatten dan weer instanties van de klassen de je nodig hebt (wat dus eerst Singletons waren).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

mbravenboer, ik heb dat nooit zo goed begrepen bij Java maar die klasse die je dan "meegeeft", dat is toch eigenlijk alleen maar een pointer (memory-reference :?) naar het object?

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
limoentje: mbravenboer, ik heb dat nooit zo goed begrepen bij Java maar die klasse die je dan "meegeeft", dat is toch eigenlijk alleen maar een pointer (memory-reference :?) naar het object?
Yep, alle objecten gaan in Java by reference. Er zijn dus eigenlijk alleen maar pointers :) . Alleen primitieven gaan by-value.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 19:23 schreef mbravenboer het volgende:

[..]

Yep, alle objecten gaan in Java by reference. Er zijn dus eigenlijk alleen maar pointers :) . Alleen primitieven gaan by-value.
Weet je dat dit eigenlijk niet waar is Martin :)
(ja ik ben mijn java certificaat aan het halen he ;))

Alle variabelen gaan bij value :)

Een object variabele is niets anders dan een pointer naar een pointer van het Object. Als het namelijk waar is dat objecten bij reference worden overgestuurd word aan test een nieuwe waarde gegeven.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test
{
    public Test()
    {
        String test = "hello";
        System.out.println(test);
        print(test);    
        System.out.println(test);
    }

    public void print(String value)
    {
        value = "World";
        System.out.println(value);
    }
    
    public static void main(String args[])
{
    new Test();
}
}

de volgende uitvoer uit:
code:
1
2
3
Hello
World
World

Het object zou immers gewijzigd zijn (en als het echt bij reference dus bij pointer was dan was het ook zo geweest)
maar de echte uitvoer is
code:
1
2
3
Hello
World
Hello

Wat dus betekend dat dat objecten niet bij reference maar bij value worden doorgeven :)

Methodes die op objecten (die bij value worden doorgegeven) veranderen wel de inhoud van het object en dat geeft de schein dat hij bij reference aangeroepen wordt. Maar in principe is dat heel logish de methode wordt aangeroepen op de pointer naar het object (die gekopieerd is en dus bij value ;) ) En deze pointer wijst naar hetzelfde object als waarvan het een kopie is (anders was het geen kopie )

Ik hoop dat het een beetje duidelijk is :)

Verwijderd

Op vrijdag 30 november 2001 19:47 schreef wasigh het volgende:

...
Wat dus betekend dat dat objecten niet bij reference maar bij value worden doorgeven :)
...
Ik weet het niet zeker.. maar moet je niet vermelden dat objecten van string/integers/.. bij value worden doorgegeven.. maar object van tabellen/matrixen bij referentie? Weet het niet zeker hoor, probeer alleen te helpen. Dus als je een string aanpast in een methode: alleen in de methode, maar als je een tabel aanpast: de tabel verandert ook voor de andere methoden (inclusief hoofdmethode).

Heb er volgende week donderdag examen over :D

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 19:54 schreef DiEana het volgende:

[..]

Ik weet het niet zeker.. maar moet je niet vermelden dat objecten van string/integers/.. bij value worden doorgegeven.. maar object van tabellen/matrixen bij referentie? Weet het niet zeker hoor, probeer alleen te helpen. Dus als je een string aanpast in een methode: alleen in de methode, maar als je een tabel aanpast: de tabel verandert ook voor de andere methoden (inclusief hoofdmethode).

Heb er volgende week donderdag examen over :D
Array's zijn ook objecten die bij value worden weergeven. Het veranderen van een waarde in een array komt overeen met het aanroepen van een methode op die array. Dus het verhaal klopt nog steeds :)

Heb over 2 weken examen :)

  • Onno
  • Registratie: Juni 1999
  • Niet online
*knipknipknip*

Hier stond niks.

Fluiterdefluit.

/me was even erg dom

Verwijderd

Op vrijdag 30 november 2001 20:01 schreef wasigh het volgende:

[..]

Array's zijn ook objecten die bij value worden weergeven. Het veranderen van een waarde in een array komt overeen met het aanroepen van een methode op die array. Dus het verhaal klopt nog steeds :)

Heb over 2 weken examen :)
Heb even voor de gein een klein programmatje gemaakt, eerst met strings en dan met tabel van strings. De code:
code:
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
class tweakersProbleem {
    public static void main (String[] args) {
        // Met strings/integers/floats/doubles/...
        String woord = "hoi";
        System.out.println(woord);
        methode(woord);
        System.out.println(woord);
        
        // Met tabellen
        String[] tabel = new String[2];
        tabel[0] = "hoi";
        tabel[1] = "hallo";
        System.out.println(tabel[0] + "," + tabel[1]);
        methode2(tabel);
        System.out.println(tabel[0] + "," + tabel[1]);
    }
    
    static void methode(String woord) {
        woord = "hallo";
        System.out.println(woord);
    }
    
    static void methode2(String[] tabel) {
        tabel[0] = "hallo";
        tabel[1] = "hoi";
    }   
}

Output:
- hoi
- hallo
- hoi
- hoi, hallo
- hallo, hoi

Dus? :)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 20:03 schreef Onno het volgende:

[..]

Je begaat een denkfout. (of je hebt een andere definitie over 'by reference' dan de rest van de wereld :P)

test wordt *echt* by reference aan print meegegeven, toch is de uitvoer gelijk als in Java. En dat is ook heel logisch als je even nadenkt over wat er nou werkelijk gebeurt met pointers enzo. :)
mmm, damn dacht ik het een keertje beter te weten... :(

Ik zie zo niet waar mijn denkfout zit. (anders had ik hem ook niet gemaakt (het wordt met de minuut intelligenter))
Zou je het uit willen leggen?

  • Onno
  • Registratie: Juni 1999
  • Niet online
Het klopt helemaal wat je zei. :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
wasigh: Weet je dat dit eigenlijk niet waar is Martin :)
Mwah, dat vind ik wel meevallen :) . Het is een kwestie van naamgeving. Voor normaal gebruik is het prettig om te denken aan pass by reference. Hiermee bedoelde ik uiteraard dat een callee een referentie krijgt naar het object wat de caller meegeeft. Dat die refentie zelf een kopie is, is een technisch detail die eigenlijk voor OO-denken niet erg relevant is.
Alle variabelen gaan bij value :)
Als jij de pointer als een value wilt zien vind ik dat prima :) . Het wordt inderdaad vaak zo omschreven, maar ik vind het een omslachtige manier van denken. Je hebt strikt genomen inderdaad wel volkomen gelijk :) .

De Java Tutorial zegt:
For a method to modify an argument, it must be of a reference type such as an object or array. Objects and arrays are also passed by value, but the value of an object is a reference. So the effect is that arguments of reference types are passed in by reference. Hence the name. A reference to an object is the address of the object in memory. Now, the argument in the method is referring to the same memory location as the caller.
:O zodra je pointers naar pointers krijgt wordt het allemaal lekker begrijpelijk ;) .
Methodes die op objecten (die bij value worden doorgegeven) veranderen wel de inhoud van het object en dat geeft de schein dat hij bij reference aangeroepen wordt.
Nou dat vind ik toch niet zo prettig omschreven. Het ligt er maar aan wat je verstaat onder pass-by-value en by-reference. Strikt genomen gaan inderdaad alle variabelen-by-value maar die naamgeving is wat ongelukkig en onduidelijk.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 20:10 schreef Onno het volgende:
Het klopt helemaal wat je zei. :)
* wasigh dankt u vriendelijk :)
Op vrijdag 30 november 2001 20:08 schreef DiEana het volgende:
code:
1
2
3
4
5
    static void methode2(String[] tabel) {
        tabel[0] = "hallo";
        tabel[1] = "hoi";
    }   
}

Dus? :)
Wat zou er gebeuren als je dit zou doen:
code:
1
2
3
tabel = new String[2];
tabel[0] = "hallo";
tabel[1] = "hoi";

een tabel[0] = "blaat"; zie ik als de aanroep van een methode op een object (ook al is het een vreemde syntax :P )

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Overigens over jouw voorbeeldje met de test variabele: dit geeft aan dat een assignment aan een parameter geen invloed heeft op een eventuele variabele van de callee. Hieruit kun je inderdaad afleiden dat de object-referenties by-value gaan. In normaal spraakgebruik zou je echter ook heel goed kunnen zeggen dat het object zelf by reference wordt meegegeven. De assigment is dan gewoon het toewijzen van een nieuwe object aan de variabele. Omdat deze variabele op een vast plek staat is het dan inderdaad een pointer naar een pointer naar een object.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Op vrijdag 30 november 2001 20:16 schreef wasigh het volgende:

[..]

* wasigh dankt u vriendelijk :)
[..]

Wat zou er gebeuren als je dit zou doen:
code:
1
2
3
tabel = new String[2];
tabel[0] = "hallo";
tabel[1] = "hoi";

een tabel[0] = "blaat"; zie ik als de aanroep van een methode op een object (ook al is het een vreemde syntax :P )
Kan je dat even uitleggen waarom, als je tabel = new String[2]; bijvoegt, dat hij de referentie dan niet aanpast? Nog nooit aan gedacht dat dit ook kon :) Ik dank je

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 20:14 schreef mbravenboer het volgende:

een mooi verhaal :)
Tuurlijk heb je gelijk over het algemeen is het makkelijk om gewoon te dingen dat objecten bij reference gaan. Maar ik heb zelf mijn kop er al een paar keer aangestoten. En voor sommige dingen is het belangrijk dat je wel weet hoe het precies zit :)

(bv casten etc..)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
In Java zijn array variabelen pointers. Als je twee array variabelen hebt (a en b) en je assigned de een aan de ander (a = b), dan wijzen ze naar dezelfde array.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op vrijdag 30 november 2001 20:19 schreef DiEana het volgende:

[..]

Kan je dat even uitleggen waarom, als je tabel = new String[2]; bijvoegt, dat hij de referentie dan niet aanpast? Nog nooit aan gedacht dat dit ook kon :) Ik dank je
Dat heeft met het pointer naar de pointer te maken.
Stel het object array staat in het geheugen op adres 10.
Op adres 11 staat dan de pointer naar het object dus de waarde 10. In je variabele wordt de pointer naar geheugenadres 11 opgeslagen
dus

variabale --> 11 --> 10 (object)

Om het moment dat de methode wordt aangeroepen wordt er een kopie van de parameter gemaakt. dus:

kopie --> 11 --> (object)

Als je nu bewerkingen uitvoerd op het kopie worden die op het object aangeroepen.
Als je nu met new de kopie naar een nieuw object verwijst dat gebeurd dat zo

kopie --> 12 --> (new object)

De methodes die je dan aanroept worden dus op het nieuwe object aangeroepen. maar de originele variabele wijst nog steeds naar 11 en dus naar het originele object

Ik hoop dat het een beetje duidelijk is :?

Verwijderd

Op vrijdag 30 november 2001 20:30 schreef wasigh het volgende:

[..]

Dat heeft met het pointer naar de pointer te maken.
Stel het object array staat in het geheugen op adres 10.
Op adres 11 staat dan de pointer naar het object dus de waarde 10. In je variabele wordt de pointer naar geheugenadres 11 opgeslagen
dus

variabale --> 11 --> 10 (object)

Om het moment dat de methode wordt aangeroepen wordt er een kopie van de parameter gemaakt. dus:

kopie --> 11 --> (object)

Als je nu bewerkingen uitvoerd op het kopie worden die op het object aangeroepen.
Als je nu met new de kopie naar een nieuw object verwijst dat gebeurd dat zo

kopie --> 12 --> (new object)

De methodes die je dan aanroept worden dus op het nieuwe object aangeroepen. maar de originele variabele wijst nog steeds naar 11 en dus naar het originele object

Ik hoop dat het een beetje duidelijk is :?
Duidelijker kon het niet, erg bedankt! :o

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Voor arrays in de JVM kan je hier kijken:
http://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#16446
Leuk stukje om te lezen :)

Nog uitgebreider is de Java Language Specification over arrays:
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html#27805

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Op vrijdag 30 november 2001 20:38 schreef mbravenboer het volgende:
Voor arrays in de JVM kan je hier kijken:
http://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#16446
Leuk stukje om te lezen :)

Nog uitgebreider is de Java Language Specification over arrays:
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html#27805
"even" doorgenomen, bedankt voor de interessante links :)
Pagina: 1