Archief - [prog] Sjcp 6

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.

Ice

Legacy Member
eniac zei:
Ik heb ondertussen bijna een jaar m'n SCJP-certificaat en ik heb het erg nuttig gevonden. Het zegt misschien niets over je programmeerkwaliteiten, maar zoals bavo al zegt, het duidt wel op het feit dat je de syntax en de kleine grilligheden van de taal kent en je klaar bent om die op 1-2-3 ook toe te passen.

Velen denken dat ze de taal onder de knie hebben, maar als je niet-gecertificeerden enkele van de neteligere kwesties voorlegt die in een goed SCJP-boek staan, dan blijkt het ineens toch zo enorm simpel niet meer te zijn.

Kunde zo eens wat voorbeelden geven van 'kleine grilligheden' ?
(en niet valsspelen en dingen uit Java Puzzlers posten hé :p )

Emerxill

Legacy Member
Ne stoeme :p
Wat is het resultaat van:
Code:
		Integer a = 120;
		Integer b = 120;
		
		Integer c = 128;
		Integer d = 128;
		
		
		System.out.println(a.equals(b));
		System.out.println(a == b);
		
		System.out.println(c.equals(d));
		System.out.println(c == d);

eniac

Legacy Member
dJeez zei:
Welk(e) boek(en) is/zijn volgens u eigenlijk aan te raden? Dat kan nuttig zijn voor diegenen die het certificaat willen halen :p.

Zonder Bavo's link aan te klikken weet ik zo al 100% zeker dat ik dat boek aanraad. :)

Ice zei:
Kunde zo eens wat voorbeelden geven van 'kleine grilligheden' ?

Tgohja, er zijn er eigenlijk genoeg. Dat wat Emerxill post bijvoorbeeld. Kleine uitbreiding daarop:

Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");

Output?

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal");

Output?

Maar er zijn nog genoeg andere dingen. Fijnere toetsen van overloading/overriding/polymorfisme bijvoorbeeld.

Vb (geen zin om echte code te schrijven):
Klasse A (met methode testMethod() {print "A"}) )
Klasse B extends A (met methdoe testMethod() {print "B"}) )

Klasse C met overloaded methode die een A neemt (doFunny(A a){print "A"}), en overloaded methode die een B neemt (doFunny(B b){print "B"}.

Roep die methode aan met een A, je krijgt de A-methode van A.
Roep die methode aan met een B, je krijgt de B-methode van A.

Tot hiertoe logisch. Maar doe dan eens dit:
A a = new B();
Roep die methode dan aan met a. Wat krijg je dan? Je weet bijvoorbeeld dat als je op a testMethod aanroept, je "B" zal geprint krijgen. Maar wat met die methodes in C?

Genoeg mensen die hier fout gaan hoor :)

Widening, autoboxing, var-args: wat gebeurt bij aanroepen van allerhande overloaded methodes? Wie krijgt prioriteit? Niet moeilijk als je het weet, maar je moet het wel weten.

Maar dan heb je nog structurele dingen ook. Waarom is het dom om "string1" + "string2" + "string3" + "string4" te doen, bijvoorbeeld. Hoe iets deftig te serialiseren en deserialiseren. Generics, die veel verder gaan dan List<MyObject> te schrijven en te zeggen dat generics easy zijn en dat ge dat kunt. Toepassingen van equals() en hashcode(), contract tussen beiden, deftig implementeren. Ochja, er zijn er zo genoeg :)


Enfin, ik heb alleszins gemerkt dat ik na het grondig doorgaan van dat boek en het afleggen van het examen, ik over veel dingen niet meer moest nadenken waar anderen een spontane "huh?" gaven.

[BAT] Hydra

Legacy Member
WHiSPy zei:
Post dan liever 'n voorbeeld van by value en by reference. :p

Als je maar niet denkt dat er in java pass by reference bestaat...

Zou iemand die een grondige kennis van java heeft kans maken om voor dat examen te slagen zonder daarvoor dien boek te leren? Staat er dan echt zoveel in dien boek dat 'speciaal' is. Die voorbeeldjes van equals, == en polymorfisme die hier gegeven zijn, zijn echt wel basic hoor...

Rajiv

Legacy Member
[BAT] Hydra;9685933 zei:
Als je maar niet denkt dat er in java pass by reference bestaat...

Zou iemand die een grondige kennis van java heeft kans maken om voor dat examen te slagen zonder daarvoor dien boek te leren? Staat er dan echt zoveel in dien boek dat 'speciaal' is. Die voorbeeldjes van equals, == en polymorfisme die hier gegeven zijn, zijn echt wel basic hoor...
Ik heb ook wel een deftige kennis van Java, maar heb besloten om de boek toch te lezen.
Als ik doorheen de boek bladerde, zag ik toch details die verwaterd waren...dus opfrissing is voor mij een must.
Wat je kan doen is eens voorbeeldexamens opzoeken, dan zal je snel weten tot hoever je kennis reikt :)

Emerxill

Legacy Member
Bavo aka Joske zei:
Los het eens op aub
als ze het juist hebben gaan we nooit weten of ze het niet eerst hebben uitgeprobeerd.
Kan goed zijn dat als ze het resultaat zien iets hebben van "huh? oekanda?" en hier iets komen posten van "wist ge dat nu niet, da's toch basis kennis!".

eniac

Legacy Member
[BAT] Hydra;9685933 zei:
Zou iemand die een grondige kennis van java heeft kans maken om voor dat examen te slagen zonder daarvoor dien boek te leren?

Natuurlijk, maar overschat die "grondige kennis" dan niet he. Zoals ik al zei, er zijn er genoeg die List<MyObject> schrijven en dan zeggen dat ze generics beheersen, maar het gaat een pak verder en is een stuk moeilijker.

Staat er dan echt zoveel in dien boek dat 'speciaal' is. Die voorbeeldjes van equals, == en polymorfisme die hier gegeven zijn, zijn echt wel basic hoor...

Basic? Dat voorbeeld van die Integers met equals en ==? Ik durf wedden dat 95% van de niet-gecertificeerde programmeurs dat keihard fout heeft. En dat voorbeeld van het aanroepen van een overloaded methode met een superklasse-referentie naar een subklasse-object zou voor heel wat verwarring en heel weinig "100% zeker en correct onderbouwd"-antwoorden zorgen. En eigenlijk hetzelfde voor de rest van m'n post.

[BAT] Hydra

Legacy Member
Ok tijd om mijn woorden in te trekken. Ik heb het namelijk even getest en daarbij kreeg ik een uitvoering die ik totaal niet verwachtte:s.

Code:
public class Integers {
  public static void main(String[] args) {
    Integer i1 = 10;
    Integer i2 = 10;
    if(i1 == i2) System.out.println("same object");
    if(i1.equals(i2)) System.out.println("meaningfully equal"); 
    Integer i3 = 1000;
    Integer i4 = 1000;
    if(i3 == i4) System.out.println("same object");
    if(i3.equals(i4)) System.out.println("meaningfully equal"); 
  }
}

En de run hiervan:

Code:
thomas@silver:~$ javac Integers.java 
thomas@silver:~$ java Integers 
same object
meaningfully equal
meaningfully equal

wtf:wtf:

*edit* Zou er iemand zo vriendelijk willen zijn dat kort even te kunnen verklaren?

WHiSPy

Legacy Member
[BAT] Hydra;9685933 zei:
Als je maar niet denkt dat er in java pass by reference bestaat...

You really made baby Jezus cry there. Serieus, leer je basic java stuff nog maar eens opnieuw. :)

Bavo aka Joske

Legacy Member
Idd, bij objecten worden de referenties als value meegegeven. Nu is dat wel muggegezift :)

Over == bij objecten, bij integer waarden kleiner dan 128 worden de waarden zelf vergeleken, bij grotere de referenties. Heeft te maken met optimalisatie en is een VM quirk.

[BAT] Hydra

Legacy Member
Bavo aka Joske zei:
Over == bij objecten, bij integer waarden kleiner dan 128 worden de waarden zelf vergeleken, bij grotere de referenties. Heeft te maken met optimalisatie en is een VM quirk.

Bedankt!

Emerxill

Legacy Member
Bavo aka Joske zei:
Idd, bij objecten worden de referenties als value meegegeven. Nu is dat wel muggegezift :)

Over == bij objecten, bij integer waarden kleiner dan 128 worden de waarden zelf vergeleken, bij grotere de referenties. Heeft te maken met optimalisatie en is een VM quirk.
Om het bij muggenziften te houden :p

... en groter dan -127

Bavo aka Joske

Legacy Member
(in de range van byte dus, wat eigenlijk groter of gelijk is dan -128)

dJeez

Legacy Member
Het is dus met andere woorden eigenlijk een bug (want geef toe : erg nuttig is het niet), die ze er gewoon in laten steken om de Cafebabe te plezieren zeker :p.

Bavo aka Joske

Legacy Member
Heb het vermoeden dat er gewoon vaste waardes in de range van Byte zijn gereserveerd om ervoor te zorgen dat vaak voorkomende Integer waarden niet telkens moeten gealloceerd worden, maar kunnen verwijzen naar één van die vaste. Zulke zaken kunnen ook voorkomen met de pooling van Strings.

Uiteindelijk kan het geen kwaad, de waarden zijn dezelfde. enkel de ref zou dat niet zijn volgens de regels, maar wat is de use case om daar ee onderscheid in te maken op dat niveau van immutable objecten?
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