Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T: 19
R: 715
|
30/11/2007 -
14:58u
| Quote
|
Ok, nu heb ik c++ achter mij gelaten, mijn programma werkt naar behoren. Deze keer is java aan de beurt!
Ik ben nog maar net begonnen en tis al miserie Ik werk met BlueJ. Het doel is om ne terminal te openen (net zoals gebeurt bij system.print) maar nu moet ge daar in kunnen typen.
Nu vond ik een klasse op internet, genaamd: keyboard.java (http://duke.csc.villanova.edu/jss/downloads/Keyboard.java) waarmee dit mogelijk is.
Nu is dus de vraag, hoe importeer ik dat?!
Ik heb de volgende code:
public class hoofdprogramma { protected nieuweNaam naam; // verwijzing naar klasse "nieuweNaam"
public static void main(String args[]) { Tekst input = new Tekst(); int n = input.readInt(); System.out.println("Nummer: " + n); }
}
Ik zou zeggen boven mijn klasse typ ik: import Keyboard.java; Maar zo gemakkelijk maakt java het niet zenne want dan zegt em: "Package Keyboard does not exist!". Ze staan thans wel in dezelfde directory...
|
mrvazil
wzl-lid
Sinds 15/5/2005
T:6 -
R:780
|
30/11/2007 -
15:12u
| Quote
|
public class hoofdprogramma implements keyboard
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
30/11/2007 -
15:51u
| Quote
|
Oeh thanx!
Nu zie ik mijn blokske al staan in BlueJ met een pijlke van mijn hoofdprogramma naar Keyboard.
Maar de compiler geeft nu een andere error op dieje implements: "interface expected here"
Kzag ook iets staan via google over "extends" ipv "implements" maar dan geeft em ne error op code Tekst input = new Tekst(); met als commentaar: cannot find symbol - Class Tekst()
Laatst aangepast door
Bondt met dt
op 30/11/2007 15:52:07u
(1x aangepast)
|
Quagmire
wzl-lid
Sinds 18/11/2003
T:62 -
R:1458
|
30/11/2007 -
16:21u
| Quote
|
Zou ge het ook niet kunnen oplossen zonder een aparte klasse af te gaan halen?
Ik heb wel al lang gene java meer bekeken, maar het zou mij toch zeer straf lijken als wat gij wilt niet standaard moest lukken....
Is dit misschien gelijk ge het wilt?
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
30/11/2007 -
17:22u
| Quote
|
Just keep it simple, mooie strategie!
Da spul werkt!
Mercii!
Laatst aangepast door
Bondt met dt
op 30/11/2007 17:22:43u
(1x aangepast)
|
naftebak
WZL-lid
Sinds 8/6/2003
T:9 -
R:1047
|
30/11/2007 -
17:24u
| Quote
|
Zoals ik het zie biedt die klasse Keyboard.java gewoon wat methodes aan om het u gemakkelijk te maken om input van de console in te lezen. Ge zou dat ook allemaal zelf kunnen doen met de standaard java klassen (zie maar naar de methode getNextInputToken in die klasse).
Soit, stel dus da ge toch die klasse wilt gebruiken:
Het makkelijkste is als ge die klasse gewoon in hetzelfde pakket steekt als uw hoofdklasse, dan kunt ge overal in uw code een instantie maken van Keyboard.java en alle methodes ervan gebruiken.
* implements wil zeggen dat uw klasse een interface zal implementeren. Als ge dus zet '... implements Keyboard.java' impliceert dat dat Keyboard.java een interface is (en vandaar dus ook die foutmeldingen die ge krijgt). Dus dat zou ik niet gebruiken  * extends wil zeggen dat uw klasse overerft van een andere klasse (= erft alle methodes over van en voegt evt. functionaliteit toe aan een klasse). Dat zou ik hier dus ook niet gebruiken, aangezien ge gewoon de functionaliteit van Keyboard.java wil gebruiken in uw code.
==> in't kort: zet die klasse in hetzelfde pakket als uw andere code en niets nodig van import, implements of extends
edit: 't was al niet meer nodig blijkbaar
Laatst aangepast door
naftebak
op 30/11/2007 17:25:53u
(1x aangepast)
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
30/11/2007 -
19:11u
| Quote
|
Uw uitleg is zeker niet overbodig en zeer nuttig aangezien java niet mijn specialiteit is, dus evenzeer merci
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
1/12/2007 -
15:26u
| Quote
|
Ok hier zijn we weer met een probleem 
Ik heb nu 3 klasses.
- Main - nieuweNaam - nieuwNummer
In de klasse nieuweNaam zijn 3 variabelen gedeclareerd met daar een bepaalde naam in:
public class nieuweNaam { string naam1 = "jan"; string naam2 = "piet"; string naam3 = "jefke"; }
Nu wil ik die variabelen ook gebruiken in mijn klasse nieuwNummer maar dan zegt em dat die variebelen niet bestaan... ik dacht dat ik mijn variabelen dan moest declareren als public ofzoiets maar hoe werkt dat precies?
Oh ja nog iets, kan het zijn dat ik gene system.out.println kan doen in andere klasses dan in de main (wat me sterk lijkt)? Ik krijg constant een error daarop: "<identifier> expected"!
|
naftebak
WZL-lid
Sinds 8/6/2003
T:9 -
R:1047
|
1/12/2007 -
17:40u
| Quote
|
Bondt met dt schreef: Ok hier zijn we weer met een probleem 
Ik heb nu 3 klasses.
- Main - nieuweNaam - nieuwNummer
In de klasse nieuweNaam zijn 3 variabelen gedeclareerd met daar een bepaalde naam in:
public class nieuweNaam { string naam1 = "jan"; string naam2 = "piet"; string naam3 = "jefke"; }
Nu wil ik die variabelen ook gebruiken in mijn klasse nieuwNummer maar dan zegt em dat die variebelen niet bestaan... ik dacht dat ik mijn variabelen dan moest declareren als public ofzoiets maar hoe werkt dat precies? In Java wordt elke variabele gedeclareerd met een 'access-level modifier' die aangeeft of die variabele toegankelijk is voor andere klassen: de mogelijkheden zijn 'public','private','protected' of niets (wat gelijk staat aan package-private). Zoals gij die variabelen nu gedeclareerd hebt zijn ze enkel toegankelijk vanuit klassen in hetzelfde pakket als de klasse 'nieuweNaam'.
Stel nu dat ge vanuit een bepaalde klasse toegang hebt tot die variabelen (wat dus het geval is voor de klasse 'nieuwNummer' als ze in hetzelfde pakket zit als de klasse 'nieuweNaam'. Om effectief aan die variabelen te geraken moet ge ofwel - een object hebben van de klasse 'nieuweNaam' ==> nieuweNaam eenNaam = new nieuweNaam(); eenNaam.naam2 ... ofwel - de variabelen static maken, dan hebt ge geen object nodig van de klasse 'nieuweNaam' ==> nieuweNaam.naam2 ...
Om nu te beslissen welke modifiers (dus enerzijds public/private/... en static/niet-static) ge aan die variabelen geeft moet ge eigl wat functioneel nadenken over uw klassen. Ge hebt ook nog de modifier 'final' die aangeeft of de waarde van een variabele ooit nog zal veranderen tijdens de levensduur van een klasse/instantie van een klasse.
Ge kunt mss daarvoor dit en dit eens lezen.
PS: Volgens 'conventies' begint de naam van een klasse in Java steeds met een hoofdletter 
Oh ja nog iets, kan het zijn dat ik gene system.out.println kan doen in andere klasses dan in de main (wat me sterk lijkt)? Ik krijg constant een error daarop: "<identifier> expected"! Normaalgezien mag dat geen probleem zijn. Kijk eens na of er geen syntax errors in uw code ervoor zitten.
|
LiJntje
wzl-lid
Sinds 6/7/2006
T:4 -
R:218
|
1/12/2007 -
18:55u
| Quote
|
Om het een beetje proper te maken gebruikt men normaal getters en setters. Daarvoor maakt ge uw attibuten private en maakt voor elk attribuut volgende methodes: public String getAttribuut(){ return attribuut; } public void setAttribuut(String attribuut){ this.attribuut = attribuut }
Als volgende punt lijken uw klasses wel bijzonder nutteloos  Ik zou om te beginnen uw nieuwe namen eerder in een ArrayList, Vector of gewoon array bijhouden en daar geen hele klasse voor maken.
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
1/12/2007 -
19:57u
| Quote
|
Super bedankt voor jullie hulp! I am yet another step closer to irresistibility!
Maar stay tuned, er zal rap een nieuwe vraag opduiken...
|
Zubzub
wzl-lid
Sinds 30/7/2005
T:2 -
R:176
|
2/12/2007 -
15:49u
| Quote
|
Bondt met dt schreef: Ok hier zijn we weer met een probleem 
Ik heb nu 3 klasses.
- Main - nieuweNaam - nieuwNummer
In de klasse nieuweNaam zijn 3 variabelen gedeclareerd met daar een bepaalde naam in:
public class nieuweNaam { string naam1 = "jan"; string naam2 = "piet"; string naam3 = "jefke"; }
Nu wil ik die variabelen ook gebruiken in mijn klasse nieuwNummer maar dan zegt em dat die variebelen niet bestaan... ik dacht dat ik mijn variabelen dan moest declareren als public ofzoiets maar hoe werkt dat precies?
Oh ja nog iets, kan het zijn dat ik gene system.out.println kan doen in andere klasses dan in de main (wat me sterk lijkt)? Ik krijg constant een error daarop: "<identifier> expected"!
String en System is met hoofdletter want het is een klasse  System.out.println(object); String naam = "de inhoud";
Laatst aangepast door
Zubzub
op 2/12/2007 15:51:42u
(1x aangepast)
|
LiJntje
wzl-lid
Sinds 6/7/2006
T:4 -
R:218
|
2/12/2007 -
16:55u
| Quote
|
Mss ook handig om te werken met een degelijk programma BlueJ is maar brol. Probeer eens met Eclipse ofzo.
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
3/12/2007 -
18:19u
| Quote
|
Weer maar eens een probleemke 
Ik heb een hoofdprogramma met een menu, een klasse ''maak getal'' en een klasse ''vraag getal op''. Wanneer ik een getal maak dan sla ik daar een kopie van op in een andere variabele zodat ik da getal kan opvragen met de andere klasse.
Toch worden er steeds nieuwe getallen gemaakt indien ik de klasse "vraag getal op" aanroep...
MAIN
switch (keuze) { case 1: nieuwGetal num1 = new nieuwGetal(); break; case 2: vraagGetal num1kopie = new vraagGetal(); break; }
Klasse nieuwGetal
int nr1 = generator.nextInt(100) + 1; int kopieNR1 = nr1;
Klasse vraagGetal
nieuwGetal verwijs = new nieuwGetal();
int getal1 = verwijs.kopieNR1;
Dus in feite verwijst de klasse vraagGetal naar de klasse nieuwGetal en haalt daar de kopie op en geeft die dan door aan de main. Allez, da zou moeten maar da gebeurt niet. Bij de verwijzing in de klasse vraagGetal worden er nieuwe getallen gegenereerd, ik vraag toch alleen die kopie op? Hoe voorkom ik dit?
|
lordfragger
[mod], gewoon [mod]
Sinds 28/6/2004
T:15 -
R:3135
|
3/12/2007 -
20:14u
| Quote
|
Ik denk dat ge ne keer ne goeie cursus over object georienteerd programmeren moet lezen, uw manier van denken lijkt mij nogal verkeerd 
Om een getal op te vragen maakt ge geen klasse maar een methode in een klasse.
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
4/12/2007 -
0:11u
| Quote
|
Waarschijnlijk correct, maar ik versimpel mijn voorbeelden enorm dus het lijkt wat stom. Ik ben geen prutprogramma aan het schrijven uiteraard. Maar nu hebt ge mij geen antwoord gegeven op mijn vragen
|
2InchBarrel
wzl-lid
Sinds 17/11/2005
T:2 -
R:11
|
4/12/2007 -
1:58u
| Quote
|
Ik gebruik EasyEclipse voor java te programmeren, misschien helpt dat?
|
GrimBlasPhemy
wzl-lid
Sinds 1/11/2004
T:0 -
R:29
|
5/12/2007 -
9:02u
| Quote
|
zoals lordFragger zegt idd... leer eerst wandelen voor je een marathon gaat lopen.
Aan uw code te zien is het heel duidelijk dat ge java niet kent. Java wijst zichzelf uit, als je het een beetje kent.
Speel eerst eens wat met hello worldjes, probeer dan wat OO principes uit te werken en begin daarna terug aan uw programma 
niet slecht bedoeld hoor, wil het je gewoon makkelijker maken 
en gebruik idd eclipse of intelliJ
|
Zubzub
wzl-lid
Sinds 30/7/2005
T:2 -
R:176
|
5/12/2007 -
21:56u
| Quote
|
Bondt met dt schreef: Weer maar eens een probleemke 
Ik heb een hoofdprogramma met een menu, een klasse ''maak getal'' en een klasse ''vraag getal op''. Wanneer ik een getal maak dan sla ik daar een kopie van op in een andere variabele zodat ik da getal kan opvragen met de andere klasse.
Toch worden er steeds nieuwe getallen gemaakt indien ik de klasse "vraag getal op" aanroep...
MAIN
switch (keuze) { case 1: nieuwGetal num1 = new nieuwGetal(); break; case 2: vraagGetal num1kopie = new vraagGetal(); break; }
Klasse nieuwGetal
int nr1 = generator.nextInt(100) + 1; int kopieNR1 = nr1;
Klasse vraagGetal
nieuwGetal verwijs = new nieuwGetal();
int getal1 = verwijs.kopieNR1;
Dus in feite verwijst de klasse vraagGetal naar de klasse nieuwGetal en haalt daar de kopie op en geeft die dan door aan de main. Allez, da zou moeten maar da gebeurt niet. Bij de verwijzing in de klasse vraagGetal worden er nieuwe getallen gegenereerd, ik vraag toch alleen die kopie op? Hoe voorkom ik dit?
wtf scheve nest 
nieuwGetal num1 = new nieuwGetal();
nieuwGetal verwijst naar de klasse van het object dat ge gaat aanmake, maw het is een klasse. Volgens java conventies begint ge die met hoofdletter. Uwe new nieuwGetal() verwijst naar de contructor van de klasse. Maw het innitialisseerd uw object, ge kunt immers meer dan 1 constructor definieren in een klasse. In uw voorbeeld maakt ge dus 2 objecten van de klasse nieuwGetal (wat dus eigenlijk NiewGetal moet zijn), die ge opvult (innitialiseerd) en die bijgevolg dus elk op zichzelf zijn en onafhanelijk van elkaar functioneren, dus geen kopie 
Ge kunt dus best uwe case anders uitwerke. Als ge wilt dat de methode altijd hetzelfde getal teruggeeft moet ge de methode static make. Static methode zijn klasse methodes, maw ze behoren tot de klasse en niet tot een object van die klasse. Ge roept ze dus op met Klasse.staticMethode(); ipv Klasse object = new Klasse(); object.dynamicMethode();
Eerst maakt ge een klasse Bleh met een static methode geefGetal(); (public static int geefGetal() ) Dit getal declareerd ge in de body van de klasse zelf ook als static. public class Bleh { static int hetGetal; public class Bleh(){ hetGetal = 5; } public static int geefGetal(){return hetGetal}}
voor uwe case maakt ge dan geen object maar vraagt ge aan de klasse het static getal op, dat dus gebonden is aan de klasse. (Als ge een object van deze klasse maakt kunt het ook daaraan vragen) Bleh.geefGetal(); of blehObject.geefGetal();
switch (keuze) { case 1: int eenGetal = Bleh.geefGetal(); case 2: int kopieVanEenGetal = Bleh.geefGetal(); }
let wel op, beide ints zijn onafhankelijk van elkaar! Als ge nu het static getal in de klasse aanpast dmv een methode zulle alle returns van de static methode geefGetal() nu dit gewijzigde getal teruggeven.
Ik hoop dat dit al iets duidelijker is
Laatst aangepast door
Zubzub
op 5/12/2007 22:06:45u
(1x aangepast)
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
6/12/2007 -
1:53u
| Quote
|
Merci voor de supergoeie uitleg! Inmiddels begin ik de structuur in te zien! Ik heb dus mijn code grondig veranderd aangezien ik het OOP principe compleet verkrachtte 
Toch heb ik nog 1 vraagske over iets wat me niet lukt!
Ik heb dus op dit moment:
klasse1 -> soort van main waar alle functies worden aangeroepen en println gedaan wordt. klasse2 -> genereren getallen voor onbepaald aantal 'gebruikers' (jan, piet,...) klasse3 -> bewerkingen op die getallen uitvoeren
Ik wil in klasse3 graag de waardes van de variabelen uit klasse2 ophalen voor een bepaald kind (jan.geefGetal()) maar telkens als ik dat probeer dan krijg ik als return-waarde '0'. Hoewel ik in klasse1 hetzelfde doe, dus: jan.geefGetal() dan komt daar wel het goeie getal uit.
Ik heb een klein vermoeden wat de oorzaak kan zijn: ik maak in klasse3 opnieuw dieje constructor klasse2 jan = new klasse2(); en dan vraag ik de waardes op. Dus nu worden die variabelen wss opnieuw geinitialiseerd waardoor ze steeds 0 zijn.
Een andere oplossing zou zijn door gebruik te maken van "extends"? Maar ook hier is het resultaat steeds "0" ofwel krijg ik de foutmelding dat variabele 'jan' niet bestaat.
Hoe haal ik nu die waardes op zonder dat ik die constructor opnieuw moet zetten?
|
2InchBarrel
wzl-lid
Sinds 17/11/2005
T:2 -
R:11
|
6/12/2007 -
2:09u
| Quote
|
heb je in klasse 2 al getters en setters gemaakt?
|