Hirdetés

Keresés

Új hozzászólás Aktív témák

  • loszerafin
    senior tag

    Sziasztok,

    JDeveloper-t használok és olvastam egy helyen, hogy ha beírom :
    /**
    akkor egy template alapján beszúrja a javadoc commenteket, de úgy, hogy beleírja a
    paraméterek neveit, meg a @throes-t meg a @return-t is.

    Pl. itt : [link]

    Nekem csak ennyit ír be:

    /**
    *
    */

    Nem tudja valaki, hogy lehet jobb javadoc template-eket beletenni a jDeveloper Studio Edition Version 10.1.3.3-ba ?

    Előre is köszönöm
    KL

    Help->Check for Updates->Install JIndent

  • loszerafin
    senior tag

    Próbálok java EE-s dolgot csinálni, az alapoknál tartok:
    1. Linuxra telepítettem Tomcat 5.5-öt, működnek a példák.
    2. Windows-on NetBeans 6-tal csináltam egy Hello World Enterprise Application-t. A NetBeans mindent megcsinált, én csak az index.jsp-t módosítottam egy kissé.
    3. NetBeans tudja futtatni a saját GlassFish szerverével.

    Próbálnám ezt a HelloWorld application-t a Tomcat-ra feltenni és onnan futtani. Ez sehogy se megy:
    A Tomcat Manager-rel deploy-oltam a szerverre a war fájlt. Ez látszólag megy, bár a visszajelzés csak egy "OK", nem az hogy "OK, deployed to .... path" vagy ilyesmi.
    A szerveren bekerül a könyvtárstruktúrába a /var/lib/tomcat5.5/webapps/EE_HelloWorld-war.war fájl és ugyanide egy EE_HelloWorld-war könyvtár, amibe a war tartalma van kibontva. (Eddig ez a hely teljesen üres volt)

    A böngészőből viszont sehogy se tudom elérni. Ráadásul a Tomcat Manager-ben se látszik a listában az EE_HelloWorld-war.
    Ha újra akarom deploy-olni, akkor "FAIL - War file "EE_HelloWorld-war.war" already exists on server"-t kapok.

    Előre is köszönöm a segítséget
    KL

    Közben találtam pár okot, amiért egyébként se működne a dolog:
    Tomcat 5.5 nem kompatibilis java ee 5-tel, szóval 1.4-gyel kellene próbálnom vagy tomcat 6-tal.

    Feltettem Windowsra a Tomcat5.5-öt, hátha könnyebb lesz.
    A NetBEans 6-ban meg felvettem szervernek a Tomcat-et, ez látszólag meg is történt,
    de mikor elkezdek egy Enterprise projectet, nem tudom szervernek kiválasztani a Tomcat5.5-öt, csak a glassfish-t. Pedig ha "Add"-dal próbálok hozzáadni, látszik, hogy a windowsos Tomcat fel van véve a szerverek közé.

    A Tomcat bin-jébe belemásoltam a *.bat állományokat, úgyhogy ez nem lehet a probléma, meg működik is a tomcat, kipróbáltam. Igaz, áttettem 8180-as portra, hogy ne zavarja a GlassFish-t.

  • Muton
    addikt

    Vagy nincs jar parancsod, vagy nincs benne a path-ban. Telepítettél j2sdk-t?

    telepítve van az 1.6-os java, van is jar.exe-m (c:\pro..\java\jdk1.6.0_05\bin. jar.exe), csak nem használja
    hol lehet a beállítani a path-t?

  • VinoRosso
    veterán

    Közben megértettem, hogy olyan kártyajátékot akarsz írni, amit még nem csináltak meg.
    Próbáld meg: magyar kártyával a makaót.
    5-5-öt osztanak, egyet felcsapnak (nem lehet különleges lap), azután színre színt vagy formára formát, sorozni lehet.
    Különleges lapok: VII-es:következő játékos kettőt húz
    Ász: következő kimarad
    Felső: színt kérhetsz
    IX: számot kérhetsz
    Ha a következőnek van ugyanolyan különleges kártyája, azzal semlegesít. A VII-esek összeadódnak, azaz ha A,B játékos is letett VII-est, akkor C-nek 2+2 lapot kell húznia.

    hmm hát régen tudtam makaózni, de nekem már újra megtanulni a játékot és leprogramozni túl bonyis lenne. De van olyan atarsolyomban amit tok, és szerintem még nem csinálták meg, mert kevesen ismerik. Azért kösz a tippet.

  • VinoRosso
    veterán

    No innen aztán lehet válogatni:
    http://www.daniweb.com/forums/thread80727.html

    na ezek már jók lesznek. Kár hogy az első postba lévő linkekeket nem lehet elérni:( Mind1 kösz a segítséget, ha majd a négyszögletű kerek erdő felé járok meghálálom! :) :R

  • VinoRosso
    veterán

    Csak valami olyat kéne kitalálni, amit még nem csináltak meg.

    Na ja, olyat én is szeretnék...

    bakker nem én modtam hanem a tanár :DDD

  • VinoRosso
    veterán

    Ja és azt még meg kell emlitenem hogy MIDP 1.0 és CLDC 1.0-ás apival toljuk, szal ha lehet akkor valami ősirégi forrás legg

    Hát, ez nem szerepelt az eredeti kérdésedben.

    1. Ha vmi rajta van a neten, azt a google megtalálja
    2/a. Ha vmi angolul könyv alakban elérhető, akkor azt az amazon-on megtalálod
    2/b. Ha magyar könyvet keresel, akkor bookline, alexandra, stb.
    3. Ha vmi csak egyetemi jegyzet formájában terjed, akkor az adott egyetem könyvtárában keress (ott vannak diplomamunkák is)
    4. Ha programozást akarsz gyorsan tanulni, akkor
    a, keress egy crash course tutorialt (max 4 oldalasat)
    b, keress példaprogramokat, futtasd, alakíts rajtuk
    c, tűzz ki egy egszerű célt (snake, mastermind, vmi kértyajáték, tank-attack) és kezdd el csinálni

    Szvsz az egyetemi oktatások nagy részét el lehet felejteni. Ritka az olyan ember, aki vmi up-to-date dolgot tanít és profin csinálja, profin ad elő és nem félti a tudását.

    egyetértek veled, de gondoltam igy jobb, mint tapasztalat nélkül belevágni a keresésbe. Biztos nem 1 oolyan ember van, aki valahogy megtanulta, és ennek egy része talán ismer valami könyvet, amit tud ajánlani. Pl Javaból én is tudnék ajánlani bevezető könyvet, amiből jól meg lehet tanulni. Jah valami kártyajáték lesz amugy a dologból, mert többre nem fogja futni az időmből. Csak valami olyat kéne kitalálni, amit még nem csináltak meg.

  • VinoRosso
    veterán

    semmi baj nincs ezzel, ha gugliba akarok keresni akkor neki jajjgatok. Nekem olyasvalakinek a tanácsa kéna, aki vágja az ME-t és tisztában va vele milyen tankönyvek vannak( ha vannak egyetalán ), és hogy melyiket érdemes kézbe venni. De azért köszi, már ez is több annál amire az órán jutottam. :R

    mod: Ja és azt még meg kell emlitenem hogy MIDP 1.0 és CLDC 1.0-ás apival toljuk, szal ha lehet akkor valami ősirégi forrás leggyen, ahogy látom itt MIDP 2.0 van, az meg nem jó mert abba már van ey csomó újítás( pl MIDP 1.0 -ba nics lebegőpontos tipus mások a memóriakorlátok stb.. )

    lehet még meg éne kérdeznem Mikkamakkát vagy Dömdödömöt :)

  • Dare2Live
    félisten

    htmldoc tud ilyet, de szvsz nem éri meg. Azon a tutorialon 1 hét alatt végigmész, kár 1 napot elvesztegetni nyomtatással, formázással.
    (Meg nem is annyira jó, didaktikailag. Persze nem rossz indulásnak, de nem elég mély, se nem elég jól felépített. Ha angolul tudsz, ezernyi másból válogathatsz, pdf-ben)

    Tudnál adni pár linket, hogy te mit/miket ajánlasz?

    btw azthiszem válaszoltama kérdésére a java + programnévvel. :)

  • Sianis
    addikt

    Esetleg egy rövid kódrészlet segítene.

    Amíg nincs, addig ilyesmi jut eszembe:

    ArrayList ar = ...;
    ar.toArray(new String[0]);

    String tömb tud utazni XML-ben?

    Sianis

  • Sianis
    addikt

    Netbeansben a Run menü Run file (Shift + F6)-tal nekem megy (NetBEans 6.0 beta 2)

    Már megjelent a stabil Netbeans 6.0.

    Sianis

  • Peetry
    senior tag

    Netbeansben a Run menü Run file (Shift + F6)-tal nekem megy (NetBEans 6.0 beta 2)

    ok de a kérdés jbuilder 2007-re vonatkozott.

  • lakisoft
    veterán

    ciklus n-szer {
    szoveg = szoveg_utolso_karaktere + szoveg_karakterei_elsotol_az_utolso_elottiig
    kiir (szoveg)
    }

    ezen még azért kell heggeszteni hogy működjön, de legalább az algoritmus megvan :)

  • fLeSs
    nagyúr

    Nem vagyok jártas ezen a téren, de elképzelhetőnek tartom, hogy a nem pc alapú szerverek piacán más JVM-ek is döntő szerephez jutnak.
    Abban biztos vagyok, hogy pc-ken a Win XP és (M$ JVM vagy SUN JVM) felállás a tipikus.

    Ha pedig tesztelni akarsz, akkor a legtipikusabb felállásokat kell megnézned, esetleg érdekességképpen egy-egy különlegességet megmutatni.
    (Pl. ilyenre gondolok: a userek 99%-a Win XP-t használ M$ JVM-mel, a tesztprogramod 10 egység alatt fut le. De ha Brutál OS-t használnának akkor Grgth cég JVM-jével 2 egység alá is mehetnek...)

    Gondolom, ide már eljutottál:
    [link]

    Még nem, de ha már belinkelted akkor átfutom. Köszi.

  • fLeSs
    nagyúr

    Gondolom, az M$ és a SUN a legelterjedtebb.

    Ha csak procit akarsz tesztelni és csak "asztali" gépekbe valót, szerintem mindegy, melyik JVM-et használod, csak az összes tesztedben legyen ugyanaz az oprendszer, ugyanaz a jvm és vagy csak appleteket nézz, vagy csak futtatható alkalmazásokat.
    Ha appletekkel tesztelsz, maradj egyetlen böngésző egyetlen változatánál.

    Miért, szervereknél mást kéne használni?

  • fLeSs
    nagyúr

    "Adott proci jó-e java-ban", szerintem ez a kérdés maga megér egy kis boncolgatást.

    Minden nagyon szvsz, amit írni fogok:

    Egy java programmal nem a processzort próbálod ki, hanem elsősorban a JVM-et, hiszen a JVM-en/ben/on fut a program.

    Ha ez igaz, akkor a kérdés így hangzana: "Mennyire jól fut egy adott JVM egy adott processzoron?"

    Na most ha ezt továbbgondolom, akkor egy JVM akkor passzolna egy processzorhoz a legjobban, ha arra az adott processzorra lenne lefordítva, így a JVM ki tudná használni az adott processzor specialitásait.

    Ha ez egyáltalán lehetséges, akkor a következménye az lenne, hogy JVM-et nem "x86"-os processzorhoz töltenénk le, hanem pl. AMD Athlon XY-hoz vagy Intel Core 2 duo XY-hoz vagy VIA akarmi ZW-hez.

    Viszont erre utaló jeleket nem találok. Persze lehet, hogy a java parancs megvizsgálja a gépet, és a processzorhoz legjobban passzoló JVM-et indítja el...

    Ellenben léteznek különböző JVM-ek (MIcrosoft, SUN, de még van pár másik is) amiken lefogadom, hogy egy adott java program különböző sebességgel fut le. Tehát azt mérhetnénk, hogy egy adott java program melyik JVM-en fut le a leggyorsabban.

    Felhívnám a figyelmed, hogy mindaz amit írtam, merő spekuláció...

    Értem amit írsz.
    Nem tudok róla, hogy lenne külön Inteles és AMD-s Java, legalábbis a Sun oldalán nem találtam, csak egy fajtát.
    Namost én nem JVM-eket akarok tesztelni, hanem procikat. :D De ezekszerint ennek csak akkor van értelme, ha többféle JVM-et használok? Maradjunk csak egynél. Így is millió tesztet kell még megnézni procinként.
    Melyik a legelterjedtebb? Gondolom a Sun-é?...

  • kalló
    aktív tag

    Innen:

    [link]

    Ez segíthet
    (egy div-et pozicionálhatsz)

    function getRefToDiv(divID,oDoc) {
    if( !oDoc ) { oDoc = document; }
    if( document.layers ) {
    if( oDoc.layers[divID] ) { return oDoc.layers[divID]; } else {
    //repeatedly run through all child layers
    for( var x = 0, y; !y && x < oDoc.layers.length; x++ ) {
    //on success, return that layer, else return nothing
    y = getRefToDiv(divID,oDoc.layers[x].document); }
    return y; } }
    if( document.getElementById ) {
    return document.getElementById(divID); }
    if( document.all ) {
    return document.all[divID]; }
    return false;
    }

    function moveDivTo(x,y) {
    myReference = getRefToDiv( 'mydiv' );
    if( !myReference ) { return; }
    if( myReference.style ) { myReference = myReference.style; }
    var noPx = document.childNodes ? 'px' : 0;
    myReference.left = x + noPx;
    myReference.top = y + noPx;
    }

    Ha a célod animáció, akkor :

    [link]

    köszönöm a linkek nagyon jók :R

  • Alvin_ti4200
    félisten

    Remek.

    Kissé átpofoztam a kódodat, de nem tudom kipróbálni:

    int[] dx={25,85,145,25,85,145,25,85,145};
    int[] dy={50,50,50,110,110,110,170,170,170};
    int[] keyCodes={512,2,1024,4,256,32,2048,64,4096};
    int keyIndex=(int)(Math.random()*9);
    sprite.next(dx[keyIndex],dy[keyIndex],keyIndex);
    lm.paint(g,0,0);
    flushGraphics();
    int keyState=getKeyStates();
    if ( (keyState & keyCodes[keyIndex]) !=0 ){
    score++;
    }
    else{
    if(keyState!=0){
    score--;
    }
    }

    A keyCodes tömb számai helyett jobb lenne enum-okat használni, úgy érthetőbb lenne a program.
    Az else ágban a keyState!=0-nak utána kellene nézni, tényleg azt jelenti-e, hogy nyomtak gombot.

    És azt hiszem, itt mindent megtalálsz a témádhoz:

    [link]

    és ez se rossz:
    [link]

    Ráadásul ez az utolsó "megvan" magyarul is:
    [link]

    ó már túl vagyok ezen a részen, megoldottam az időzítést is Timer és TimerTask nélkül:) Most írom az RMS részt, hogy tárolni és megjeleníteni is tudjam a HighScore-okat:)

  • Alvin_ti4200
    félisten

    Jól értetted, így gondoltam, látom, gyorsan "fogod" az adást

    Lenne pár megjegyzésem a programozási stílussal kapcsolatban:

    1. Próbálj meg angol azonosítókat használni, jobban illenek a programozáshoz
    2. Próbálj meg olyan azonosítókat választani, amik a funkcióra utalnak és nem a
    tartalomra, vagy típusra (pl: veletlen, tomb nem szerencsés)
    3. Próbáld meg betartani a Sun névkonvencióit (változónevek első betűje kicsi, ha több szóból áll, akkor a többi kezdőbetű nagy
    4. Szeparáld a kódodat. rajzolás és user input mehetne külön metódusba, akár külön osztályban is lehetnének (cohesion)

    Találtam egy fórumot, talán segít, rákeresve a getkeystates szóra van pár programpélda
    [L]http://developer.sonyericsson.com/search.jspa?objID=c2&q=getkeystates[/L]

    Ha az a gyanúd, hogy az időzítések miatt megy össze vissza a programod, olvasd el ezt:

    [L]http://java.sun.com/docs/books/tutorial/essential/concurrency/sync.html[/L]
    (Legyenek a metódusaid syncronized-ek)

    De lehet megoldás az is, hogy nevezzük egy "körnek" a lámpa kigyúlásától a gomb lenyomásáig vagy az idő lejártáig tartó játékrészt.
    Ekkor a kör végén hagyd a szálakat összefutni (mindegyik fejeződjön be), majd indítsd újra a szálakat, így nem lesz olyan, hogy pl. az előző lámpához tartozó gombnyomást fogja a programod jónak érzékelni. Meg egyébként is "tisztább, szárazabb érzés" lesz, hogy a szálaid ugyanazt a "kört" kezelik.

    Hajrá, kíváncsi vagyok a programodra, ha nem titkos, küldhetnél egy forrást az emailemre.

    nem titkos, kedden délután már elárulhatom, akkor már túl leszek a bemutatásán és a leadásán:) Konzultáltam ma a szakirány tanárommal és azt javasolta, hogy bonstam ketté a render() metódust, mégpedig rajzolós és billentyűzetelemzős részre. Módosítsam ezek alapján a Midletben a szál run() metódusát úgy, hogy először billvizsgálatot csinál, aztán vár valamennyit, aztán egy for ciklusba tegyem bele a rajzolós metódust és ehhez mérten igazítsam mennyi ideig sleepeljen a thread. Tehát pl. 1 mp-es képváltásnál thread.sleep(50) és ciklusváltozó 0-19. Most ezt fogom megpróbálni megcsinálni, remélem sikerrel járok és utána már "csak" az RMS (RecodStore) rész van hátra az eredmények mentéséhez és kiírásához (HighScore).

  • Alvin_ti4200
    félisten

    Nagyjából érthető, nekem csak a 9 db IF szúrt szemet.

    Rakd be tömbbe a lenyomható gombokat, vizsgáld meg, a tömbben van-e a lenyomott gomb
    és egyezik-e azzal ami kell neked, ha igen adj pontot, ha nem, vonj le egyet.

    kb így :
    if nyomtak_le_gombot then
    pontszam+=(lenyomhato_gombok[veletlen] == lenyomott_gomb) ? 1 : -1;
    else lejart_az_ido then /* nem nyomott meg semmit és már vált a lámpa */
    pontszam-=1;

    megcsináltam az alábbi módon:) (remélem jól értelmeztem a mondani valódat:D)

    int[] tomb1={25,85,145,25,85,145,25,85,145};
    int[] tomb2={50,50,50,110,110,110,170,170,170};
    int[] gombtomb={512,2,1024,4,256,32,2048,64,4096};
    Random rnd=new Random();
    int veletlen=rnd.nextInt(8);
    dx=tomb1[veletlen];
    dy=tomb2[veletlen];
    sprite.next(dx,dy,veletlen);
    lm.paint(g,0,0);
    flushGraphics();
    int keyStates=getKeyStates();
    if (keyStates==gombtomb[veletlen]){
    pontszam++;
    }
    else{
    if(keyStates!=0){
    pontszam=(pontszam)-1;
    }
    }

    Apró szépséghiba, hogy az időzítések össze-visszasága miatt a jó billentyűleütéseket is néha rossznak veszi és fordítva, illetve valamiért a 2,4,5,6,8 gombok értéke nulla:F Pedig tudomásom szerint azok felveszik a LEFT_PRESSED, RIGHT_PRESSED, UP_PRESSED, DOWN_PRESSED és FIRE_PRESSED értékeit is. A gombtomb[]-ben a gombok sorrendjében tároltam le a koordinátákat, tehát az index maga a gomb száma. Lehet az a gond, hogy a paint és/vagy flushgraphics után tettem a feltételeket?

  • loszerafin
    senior tag

    Itt a Java kód:

    Csak azért írom egy sorba, hogy ha vki gondolkodni akar, ne lássa rögtön a megoldást
    /* */ int i=95; int x=5; while (i>0 && x>0) { if (Math.random()*i<=x) { System.out.println(i); x--; } i--; }

    Egyébként az a "mellékhatása" az algoritmusnak, hogy a kihúzott számokat nagyság szerint
    rendezve írja ki.

  • loszerafin
    senior tag

    Annyit hozzáteszek, hogy ez egy klasszikus probléma, és van is "klasszikus" megoldása:

    Képzeld el, hogy vki mondja neked a számokat sorba.
    Te néha megállítod az illetőt és felírod egy papírra a számot.

    Hogy mikor állítod meg, az itt a kérdés.

    Az egyszerűség kedvéért tételezzük fel, hogy nagyság szerint csökkenő sorrendben
    mondja a számokat.

    Képzeld el, hogy most éppen az "i" számot mondja (azaz még i db szám közül választhatsz), neked meg még x db számot kell
    kiválasztanod.
    Mikor állítod meg az illetőt? Másképp fogalmazva: Mekkora valószínűséggel állítod meg?

    (az eredmény program tárhelyigénye: 2 egység, egyetlen ciklus van benne, ami max. 95-ször fut le)

    Üdv
    KL

    Itt a Java kód:

    Csak azért írom egy sorba, hogy ha vki gondolkodni akar, ne lássa rögtön a megoldást
    /* */ int i=95; int x=5; while (i>0 && x>0) { if (Math.random()*i<=x) { System.out.println(i); x--; } i--; }

  • jeri
    tag

    Ezt olvastam egy Sybex könyvben:

    --------------------
    Which of the following statements accurately describes how variables are passed to methods?
    A. Arguments are always passed by value.
    B. Arguments are always passed by reference.
    C. Arguments that are primitive type are passed by value.
    D. Arguments that are passed with the & operator are passed by reference.
    --------------------

    Boldogan bejelöltem az A-t, majd megnéztem a megoldást:

    C. Arguments are not always passed only by reference or only by value. It depends on the
    argument itself, and primitives are always passed by value. Java does not use the & operator
    to denote “pass by reference” as is done in the C programming language. See Chapter 1 for
    more information.

    Én azt gondolom, hogy mindig értékmásolás történik paraméterátadásnál, függetlenül attól, hogy objektum referencia vagy primitív típusú az átadni kívánt paraméter.

    Ha ''objektumot adunk át paraméterként'' akkor nem is az objektum a paraméter, hanem az objektum referencia, ami már ''by value'' kerül a metódusba.

    Mit gondoltok?


    Közben megnéztem a Sun site-ján (nyilván ott olvastam ezt) és bizony így van
    http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
    Úgyhogy ezt a Sybex könyvet el kell felejteni...

    C és társai érték szerint
    meg létezik:címszerint,eredmény-érték szerint,visszatérési érték szerint.

  • almi
    senior tag

    Keress rá a sourceforge.net en meg a freshmeat.net-en.
    Ha pont ilyen nincs, akkor is találhatsz egy csomó játék-író környezetet, van, amelyik kifejezetten táblás játékok írásához készült.


    [Szerkesztve]

    :R Köszönöm szépen, hátha segít valamit..

  • Fisha
    őstag

    ezeket nagy if (vagy case) elagazasokat kicsit gondosabb tervezessel ki lehet kuszobolni.

    Bizony így van. Szerintem 6-8 case -nél többet inkább adatszerkezettel (tömb, hash) érdemes megcsinálni. Karbantartani is könnyebb, meg a kód is rövidebb.

    Egyébként visszatérve a Java-hoz, szerintem ez a fajta case ügyetlen.
    A falra tudnék mászni a fall-through tulajdonságától meg mert nem lehet ilyeneket írni:

    case 1..10
    vagy
    case 1,2,3
    vagy case (i>10)
    stb.

    Persze, valószínűleg épp ezért (1,2,3 és 1..10 hiánya miatt) kell a fall-through tulajdonság, mert így ilyeneket lehet írni:
    case 1:
    case 2:
    case 3: System.out.println(''1..3''); break;

    De ez azért eléggé ronda egy kódban. Szerintem.
    KL

    Hat igen, en pont ezek miatt a dolgok miatt, vettem ki a szotarambol. :)

  • shev7
    veterán

    ezeket nagy if (vagy case) elagazasokat kicsit gondosabb tervezessel ki lehet kuszobolni.

    Bizony így van. Szerintem 6-8 case -nél többet inkább adatszerkezettel (tömb, hash) érdemes megcsinálni. Karbantartani is könnyebb, meg a kód is rövidebb.

    Egyébként visszatérve a Java-hoz, szerintem ez a fajta case ügyetlen.
    A falra tudnék mászni a fall-through tulajdonságától meg mert nem lehet ilyeneket írni:

    case 1..10
    vagy
    case 1,2,3
    vagy case (i>10)
    stb.

    Persze, valószínűleg épp ezért (1,2,3 és 1..10 hiánya miatt) kell a fall-through tulajdonság, mert így ilyeneket lehet írni:
    case 1:
    case 2:
    case 3: System.out.println(''1..3''); break;

    De ez azért eléggé ronda egy kódban. Szerintem.
    KL

    ha jol tudom a switch case szerkezet egy goto-nak fele meg. Ezert van az, hogy nem lehet felsorolni a case utan tobb erteket, mivel akkor nem stimmelne a label. Es ezert van az, hogy kell a break, mert goto utan a kovetkezo sorban folytatod. Persze biztos meg lehetett volna oldani maskepp, de az nagy valoszinuseggel lassabb lett volna.

    mod: Ha megnezzuk a C# fele switch megvalositast, akkor az annyibol kezdo-baratabb, hogy muszaj kitenni a break-et, ezert nem is nezheted be a fall-through-t

    [Szerkesztve]

  • Fisha
    őstag

    Csak nyavajgás következik...

    Ahogy egyre jobban elmerülök a Java-ban, egyre nehezebbnek tartom.

    Ez az auto boxing/widening témakör kemény dió.

    A témakörök:
    1. értékadások
    2. overload-olt metódusok hívása (mikor, melyik hívódik)
    3. == vizsgálat
    4. switch - case
    5. és még ki tudja, hány témakör van

    Pl. a switch-nél most olvastam:
    class Proba {
    final static int i = 2;
    final static Integer I = 3;
    public static void main(String[] args){
    int x = 2;
    switch (x){
    case i : System.out.println(x);
    case I : System.out.println(x);
    }
    }
    }


    Hogy semmilyen wrapper osztály nem lehet a case-ben, akkor se, ha final. Pedig ugye a wrapperek immutable-ek, úgyhogy nem tudnám megváltoztatni az értékét a referencia változtatása nélkül.

    Megmondom oszinten nekem a switch-case eleve egy nyelvidegen dolog. Mar leirva is rosszul nez ki. :)

  • shev7
    veterán

    Most, hogy másodszor/harmadszor olvasom el a Java könyvemet, ''újabb'' érdekességekre bukkanok...

    StringBuilder equals metódus

    Úgy látom, nincs felülírva a StringBuilder osztályban az equals.

    Akkor így szoktak két StringBuilder-t összehasonlítan?:

    StringBuilder s1 = new StringBuilder(''Hello'');
    StringBuilder s2 = new StringBuilder(''Hello'');

    System.out.println(s1.toString().equals(s2.toString()));


    És tudja valaki, miért nincs az equals felülírva a StringBuilder osztályban?

    Előre is köszönöm
    KL

    hat mondjuk erre kezenfekvo valasz az, hogy egyreszt nem egyertelmu mikor egyezik meg ket StringBuilder objektum (marmint tobbfele megkozelites is elkepzelheto), illetve, hogy nagyon ritkan hasonlitasz ossze ket stringbuilder objektumot, ami sokkal inkabb elkepzelheto az az, hogy egy Stringhez hasonlitod.

    De barmikor kiterjesztheted a StringBuildert, es akkor ugy mukodik az equals, ahogyan csak szeretned :)

  • robisz
    senior tag

    for ciklus

    Nem fér a fejembe a for ciklus indító részének első tagja, a deklarációs rész:

    for(int i=0; i<10; i++){
    }

    Félkövérrel szedtem a kérdéses részt. Itt ugye lehet több lokális változót deklarálni és inicializálni, ami csak a cikluson belül lesz elérhető, így:

    for(int i=0, j=0, k=0; i<10; i++){ ...

    Nem csak int lehet ott, hanem bármi, amin végig lehet lépkedni:

    for(byte i=0, j=0, k=0; i<10; i++){ ...

    Ami nekem furcsa, hogy keverni nem lehet a típusokat, azaz ez már nem megy:

    for(int i=0, byte j=0, short k=0; i<10; i++){...

    De még csak ez se fordul le:

    for(int i=0, int j=0, int k=0; i<10; i++){...

    Nem értem, miért ez a megszorítás? Miért jó,hogy csak ugyanolyan típusú változókat deklarálhatok és inicializálhatok? (Ráadásul a doksikban se igen találtam erre utalást:
    http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.1)

    Előre is köszönöm
    KL

    A for ciklus általános szintaxisa:

    for (kifejezés1; kifejezés2; kifejezés3) {
    ...
    }


    Tehát három tetszőleges kifejezést kell megadni (lehet üres kifejezés is).
    Viszont a Java-ban nem tudsz egy kifejezéssel különböző típusú referenciákat
    létrehozni, tehát az alábbi deklaráció nem csak a for ciklusban, hanem mindenhol hibás:

    int i = 0, byte j = 0;

    Pontosvesszővel elválasztva már jó de így már két kifejezésnek számít:

    int i = 0; byte j=0;

    Azonos típusú változóból viszont többet is létrehozhatsz egy deklarációval:

    int i = 0, j=0;

    Ezt tehát nyugodtan beírhatod a kifejezés1 helyére.

  • Forest_roby
    őstag


    Sajnálom, hogy késtem 1 órát, de úgy érzem, ha 1 héttel ezelőtt írok, az is késésben lenne.

    Amit javaslok:
    Egy gyors Java alapok:
    http://java.sun.com/docs/books/tutorial/
    (Erre 1 hét elég lehet, ha nagyon nekifekszel, 3 nap /napi 4 óra alvással/)
    Learning the Java language, Essential java classes, Collections, Deployment

    Ezután JDBC:
    http://java.sun.com/docs/books/tutorial/jdbc/index.html

    Majd ez (bár ez egy monstrum, úgyhogy szelektálnod kell, viszont én nem ismerem a Javat eléggé, hogy ebben segítsek)

    http://java.sun.com/j2ee/1.4/docs/tutorial/doc/

    És nem árt némi AJAX ismeret (szerintem):
    http://www.w3schools.com/ajax/default.asp

    Ehhez persze JavaScript, css és html tudás is kell, amit szintén megszerezhetsz a w3schools oldalain.

    Tudom, hogy én írtam későn! Nem hibáztattam senkit, maximum magamat.

    Mindenesetre köszi ezeket a linkeket! :R

  • robisz
    senior tag

    Khm. Bocs, hülyeséget írtam. De legalább most, hogy rákérdeztél, magam is rájöttem.

    Tehát javítom magam:


    Nem tűnik el se a forrásfájlból (hiszen ez az értelme),
    se a lefordított kódból (sajnos), hiszen a java futtatót kell paraméterezni az assertion-ök ki/bekapcsolásához.

    Viszont nagyon kényelmesen kezelhető (parancssorból ki/bekapcsolható), osztályokra és csomagkönyvtárakra külön-külön, és nem lassítja a kódot, ha nincs bekapcsolva.


    Ugyanezt el tudod érni a Logger-ból is, hiszen vannak loglevelek amiket be tudsz állítani :)
    Pl. a kódba azt írod hogy:

    log.debug(message);

    Így a loglevel-t debug-ra állítva megjelenik az üzenet, de pl. info-ra állítva nem.

    Az assert szintén debug-olásra használható, de nem logolásra!!
    Arra találták ki, hogy olyan logikai állításokat helyez el a kódban, amelynek
    az adott ponton teljesülnie kell. Ha mégsem akkor az kivált egy exception-t.
    Amire Te használod, az ugyan működik, de nem szép mert nem erre találták ki.

  • sekli
    addikt

    Hát, én nem tudok vitorlázni és ezt a programot valószínűleg elindítani sem. De ha el is indítanám se tudnám, mit hogy állítsak be rajta.

    Bejött egy kép, bal felső sarokban feltehetően egy szélzsák meg kriksz-krakszok a képernyőn, de sehol egy ellenfél, akit le lehetne lőni :) ...

    Ha most ehhez hozzáveszem, hogy mondjuk az emberek tudása a vitorlázásról (nagy átlagban) kb az enyémnek megfelelő szinten van és hogy az intelligenciám nem átlag alatti, akkor ez a fórum ennek a kérdésnek a megválaszolására nem alkalmas.
    Miért nem írsz a játék fórumába?

    A ''90%-ot a grafika teszi ki'' : ez sok minden lehet. A programkód 90%-a? a belefeccölt munka 90%-a? A futásidő 90%-a?
    Ez egy szimulátor, és ha a hajókat tényleg a szél lökdösi, meg a vitorlákat lehet állítani (és még ki tudja mit) és többen is vagytok egyszerre (hálózatos a játék), korántsem gondolnám triviális feladatnak és még csak megbecsülni se tudom, milyen nehéz kiszámolni az egyes hajók adatait (pl. hely, irány, sebesség) és az algoritmus meddig fut.

    Azt gondolom, próbáld ki egy gyengébb gépen, ha lassú, kérdezz a fejlesztőtől.

    :) loni meg nekem se sikerult...:) a lenyeget szerintem lattad egyebkent, marmint ami a grafikat illeti..., igazabol nem akartam nagyon belemenni, csak nekem azt tunt fol, hogy ha VisualBasic-ben irnek egy hasonlot (ahogy irtam is) es sokkal kevesebb eroforrast hasznal, a programozoja azt mondta, hogy a ''grafika'' itt az eroforrashasznalat, processzorido 90%-a..., a szimulacio, azert nem annyira komplex... a kerdesem igazabol arra iranyult, hogy a java ennyire lassu-e a megjelenitesben...? most kezdte el fejleszteni a fejleszto a 3D-s verziot, (az en modellem alapjan) es azt igeri, hogy a GPU rendereles miatt jobban fog futni..., ez egyebkent hiheto is... koszi, hogy foglalkoztal vele..., ahogy nezem mondjuk nem lettel fuggo...:)

  • shev7
    veterán

    Köszi a logger osztály infót.
    Megnéztem egy kissé, de nekem elsősorban debug-oláshoz kell, azaz jó lenne, ha eltűnne a kódbol mikor készen vagyok. Ezért jó az assert-es megoldás.

    errol irnal kicsit bovebben? mit ertesz azon, hogy eltunik, ha keszen vagy?

  • Forest_roby
    őstag

    És mi nem megy?
    1. Server oldalon nem tudod módosítani az adatbázist? (SQL gondok/Java sql használat gondok/
    2. Serverprogramod nem tudja elkapni az adatokat?
    3. html Weboldaladból nem tudod elküldeni az adatokat? (form/ajax probléma)
    4. Java appletből nem tudod elküldeni az adatokat a szerver felé?


    Talán ezek segítenek:
    1. [link]
    3. [link]
    3. [link]




    [Szerkesztve]

    1órát késtél a válasszal! :(

    Hogy mi nem megy?
    Az idáig működő részeket se látom át (igazán)...
    Innentől kezdve meg az egész gáz...
    pl az adatmódosítást hogyan érzékeli a program(, vagy gombenyomásra update-eljen)?
    az update megírása se igazán megy... :(
    Nincsenek nagy problémáim, csak nem értem az egészet!

    mod: de mostmár mindegy!

    [Szerkesztve]

  • hdanesz
    őstag

    Próbálkozz a ''Mozilla Firefox'' vagy a ''Windows XP kérdések és válaszok'' topikban.

    Köszi!
    Az xp-ben már írtam,de nem válaszolt senki. :(
    Megpróbálom a firefox-ost.
    :R

  • sekli
    addikt

    Megnéztem az oldalt, de nem találtam a játékot.

    Ha nincs forrás fájl, nem hiszem, hogy sokat lehetne javítani a futási sebességen.

    nem en szeretnek javitani, hanem, erdekel a velemenyetek, hogy normalis-e, hogy egy ilyen program ennyit terhel..., a keszito szerint 90%-ot a ''grafika'' teszi ki...

    [link] az oldal kozepe fele van egy tablazat: Tacticat Sailing Fields ott vannak a gombok, hogy S1, L1, t4... , arra kell kattintani, hogy elinduljon...

  • Drizzt
    nagyúr

    Én eléggé új vagyok a Javában, de a show az deprecated. setVisible(true) a menő 1.5 óta.
    A setMinimumSize() beleszólhat a dologba.
    Nálam awt-tal megy:




    import java.awt.*;
    import java.awt.event.*;
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.*;
    import java.util.*;
    [...]
    class MyFrame extends Frame implements Runnable{
    [...]

    MyFrame(){

    [...]
    setSize(100,100);
    [...]
    setVisible(true);

    [...]

    }


    [...]
    }



    [Szerkesztve]

    Az volt a para, hogy a htm file bírálta felül. :S
    Na más egyszerűbb kérdésem van. Appletet kell csinálni, írtam egy filet IntervalException.java néven, ahol van. Az importálásához kell még valami, hogy lássa? Elég idegesítő, hogy Unixon kell fejleszteni(ssh loginnal), így elég nehézkes, míg valamit kipróbálgtok...

  • robisz
    senior tag

    debug üzenetek

    Gondoltam jó lenne pár debug üzenet, és erre kézenfekvő az assert-et használni, úgyhogy csináltam egy Log osztályt:

    class Log {

    static int Level = 6;

    public static boolean log(int level, String s){
    if (level>=Level) System.out.println(s);
    return(true);
    }

    public static boolean dlog(int level, String s){
    if (level>=Level) {
    new Throwable().printStackTrace();
    log(level,s);
    };
    return(true);
    }
    }


    Ezt a programban így lehet használni:
    assert Log.log(5,''itt vagyok'');

    assert Log.dlog(7,''itt vagyok'');

    A log csak az üzenetet írja ki, a dlog a stack-et is.

    Van erre valami bejáratott út, vagy megfelelő ez?

    Előre is köszönöm
    KL

    Szia!

    Logolásra a java.util.Logger osztály a megoldás (ez nem túl régen
    került a Java-ba), vagy pedig a log4j csomag amit külön kell letölteni
    és talán még az előbbinél is többen használják. Tudásban kb. ugyanaz a kettő.

  • Fisha
    őstag

    Sziasztok,

    Kb. már tisztában vagyok a Java alapokkal, szerintetek hogyan tovább, mit tanuljak?
    UML-t látom hasznosnak meg a Design Pattern-eket. Vagy esetleg mást?
    Gondolkodtam a konkurrens programozás elméletén, ami jól jöhet a szálak írásakor, de ez talán csak később kellhet.
    Azután itt van a unit tesztelés, javadoc, i18n.
    Persze, gyakorlatot kellene szereznem, de nem akarok rossz (=gyenge minőségű) programokat írni, gyakorlás képpen sem.

    Előre is köszönöm
    KL

    Velemenyem szerint elso korben jdbc, servletek jsp-k, aztan egy tetszoleges mvc framework. Persze ha az a cel, hogy a konnyen el tudj helyezkedni. Ilyen temakorben keresnek a legtobb embert. Aztan johetnek ejb-k egyebek.

    Egyebkent maga az, hogy j2ee annyira tag fogalmkor, hogy nem igazan lehet azt mondani, hogy akkor en most j2ee-t tanulok.

  • robisz
    senior tag

    Sziasztok,

    Kb. már tisztában vagyok a Java alapokkal, szerintetek hogyan tovább, mit tanuljak?
    UML-t látom hasznosnak meg a Design Pattern-eket. Vagy esetleg mást?
    Gondolkodtam a konkurrens programozás elméletén, ami jól jöhet a szálak írásakor, de ez talán csak később kellhet.
    Azután itt van a unit tesztelés, javadoc, i18n.
    Persze, gyakorlatot kellene szereznem, de nem akarok rossz (=gyenge minőségű) programokat írni, gyakorlás képpen sem.

    Előre is köszönöm
    KL

    Ha később komolyan akarsz Javazni, esetleg ilyen téren szeretnél dolgozni,
    akkor egyet ajánlok: J2EE.
    Ha a ''sima'' Java már elég jól megy, akkor mindenképp érdemes megismerkedni vele.
    Az UML és a Design Pattern-ek ismerete mindig (de J2EE-hez különösen) jól jöhet!

  • robisz
    senior tag

    Ha jól értem a JVM-ek működését az olvasmányaim alapján, akkor nincs garantálva, hogy időosztásosan működjenek a JVM-ek. Azaz, ha azt akarom, hogy a többi szál is labdába rúghasson, kell sleep()-et tennem a hosszan futó ciklusaimba. Vagy tévedek?
    Tehát nem a lock az érdekes itt, hanem hogy egy szál nem engedi futni a többit, mert nincs benne sleep és sose áll le.

    Ha jól értem a JVM-ek működését az olvasmányaim alapján, akkor nincs garantálva, hogy időosztásosan működjenek a JVM-ek. Azaz, ha azt akarom, hogy a többi szál is labdába rúghasson, kell sleep()-et tennem a hosszan futó ciklusaimba.

    Igazából a yield() metódust találták ki megoldásként erre problémára, de sajnos
    kínszenvedés a használata mert nagyon nem egyértelmű mikor kell meghívni.
    (Valami olyasmit lehet elképzelni, hogy pörgetsz egy számlálót a ciklusodban és
    minden 10-edik futáskor meghívod a yield()-et vagy valami hasonló)

    Szerencsére azonban ez a probléma a ''való életben'' elég ritkán fordul elő,
    hisz az ember általában olyan szálakat ír amelyek egyébként is blokkolnak.
    Pl. mert egy socket-ről akarsz olvasni vagy vársz egy beérkező üzenetre... stb.

  • shev7
    veterán

    Még annyit hozzáteszek azok kedvéért, akik később olvassák ezt a topicot:

    Azt hiszem nem szerencsés egy több szálon futó programban olyan ciklust futtatni, amiben nincs Thread.sleep(), mert így nem hagyunk időt másik szálaknak a bekapcsolódásra, ráadásul zabálja a processzort, szóval
    valami ilyesmi jobb, mint ami a fenti kódjaimban látható:


    while(!end){
    synchronized (lock) {
    cnt += 1;
    cnt -= 1;
    };
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {}
    }


    mivel a program alapesetben mast is csinal, nem csak a lockolt teruleten tolti az idejet ez nem szokott problemat okozni, de a te peldadban tenyleg jol jon egy kis sleep. :)

  • loszerafin
    senior tag

    Köszönöm, valóban jó megoldás egy lock objektum létrehozása:


    class Counter3 {
    static int cnt = 0;
    static boolean end = false;
    static Object lock = new Object();

    static class ModCounter implements Runnable {
    public void run() {
    while(!end){
    synchronized (lock) {
    cnt += 1;
    cnt -= 1;
    }
    }
    }
    }

    public static void main(String[] args)
    throws InterruptedException{
    ModCounter modc = new ModCounter();
    Thread t1 = new Thread(modc);

    t1.start();

    for(int i=0; i<10; i++){
    Thread.sleep(500);
    synchronized (lock) {
    System.out.println(cnt);
    };
    };
    end = true;

    t1.join();
    System.out.println(cnt);
    }
    }



    Még annyit hozzáteszek azok kedvéért, akik később olvassák ezt a topicot:

    Azt hiszem nem szerencsés egy több szálon futó programban olyan ciklust futtatni, amiben nincs Thread.sleep(), mert így nem hagyunk időt másik szálaknak a bekapcsolódásra, ráadásul zabálja a processzort, szóval
    valami ilyesmi jobb, mint ami a fenti kódjaimban látható:


    while(!end){
    synchronized (lock) {
    cnt += 1;
    cnt -= 1;
    };
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {}
    }


  • shev7
    veterán

    Próbálkozom a thread-ekkel és elakadtam.

    a run() metódusom szinkronizált, egy ciklusban a cnt mezőhöz hozzáad egyet, majd ki is von.

    A main()-ben 500 msec-enként kiírom a cnt értékét. A kimenet hol 0, hol egy. Nyilván, a main() metódust futtató szál println-ja ''beüt'' a cnt-hez hozzáadó és abból kivonó utasítás közé. Hogy lehet ezt elkerülni?


    class Counter1 {
    static int cnt = 0;
    static boolean end = false;

    static class ModCounter implements Runnable {
    public synchronized void run() {
    while(!end){
    cnt += 1;
    cnt -= 1;
    }
    }
    }

    public static void main(String[] args)
    throws InterruptedException{
    ModCounter modc = new ModCounter();
    Thread t1 = new Thread(modc);

    t1.start();

    for(int i=0; i<10; i++){
    System.out.println(cnt);
    Thread.sleep(500);
    };
    end = true;

    t1.join();
    System.out.println(cnt);
    }
    }


    Kimenet:


    0
    1
    1
    0
    0
    1
    1
    1
    0
    1
    0


    Szeretném, ha csupa 0 jelenne meg.

    Próbáltam a kiírást szinkronizálni:


    synchronized (Counter1.class) {
    System.out.println(cnt);
    };


    De semmi változás.

    Előre is köszönöm
    KL

    nezd meg ezt:


    class Main {
    static int cnt = 0;
    static boolean end = false;
    static Object lock = new Object();

    static class ModCounter extends Thread {
    public void run() {
    while(!end) {
    synchronized (lock) {
    cnt += 1;
    System.out.println(cnt);
    cnt -= 1;
    }
    }
    }
    }

    public static void main(String[] args)
    throws InterruptedException{
    ModCounter modc = new ModCounter();
    ModCounter modc2 = new ModCounter();
    modc.start();
    modc2.start();

    Thread.sleep(500);

    end = true;

    }
    }

    [Szerkesztve]

  • Lortech
    addikt

    [...]hanem a referencia kerul atadasra, pont ezert hivjuk referencia szerinti atadasnak...

    Nem, nem. A ''referencia szerinti paraméterátadás'' fogalma független a Java-tól, független az objektumoktól, sőt független az objektum orientált programozástól.

    Egyrészt:

    Az érték szerinti paraméterátadás a következő:
    A hívó fél által átadott dologról (paraméter) egy másolat készül. Ezt a másolatot használja a hívott fél. Azaz a hívott fél hiába módosítja az argumentumát, az nincs kihatással a paraméterre, a hívó fél a módosításról nem vesz tudomást, hiszen a hívott eljárás csak egy másolatot módosít.

    A referencia szerinti paraméterátadásnál ha a hívott fél módosítja a megkapott dolgot,
    akkor a hívó félnél is megváltozik a dolog.

    Az, hogy ezt hogy oldják meg az egyes nyelvek, vagy megvalósítják-e egyáltalán, az most nem érdekes.

    Javában paraméterként objektum referenciát megadva a hívott eljárás egy másolatot kap a referenciáról, azaz azt hiába változtatja meg (nem az objektumot, hanem a referenciát), ebből a hívó fél semmit sem érzékel. Tehát az objektum referencia is érték szerint adódik át a hívott metódusnak.
    Pl. Nyugodtan lehet null-ra állítani a metódusban a megkapott objektum referenciát, attól még nem vész el az objektumunk, csak eggyel kevesebb referenciája lesz, és minimum egy marad, amit a hívó fél használ.



    Valóban, referencia típusnál is átmásolódik a hívó paraméter referenciája a hívott paraméterbe. De mivel ez egy referencia, azaz mindkettő rámutat majd ugyanarra az objektumra, ezért mellékhatásokkal jár, ha a lokál paraméterrel mutatott objektumot mdosítjuk. Maga a paraméterként átadott objektum értéke, referenciája valóban nem fog megváltozni. Viszont az előbb említett mellékhatás miatt célszerű megkülönböztetni a hagyományos érték szerinti paraméterátadástól. Mint ahogy a ''valódi'' referencia szerintit is meg kell különböztetni tőle, ahol nem a referencia adódik át, hanem magának a referencia típusú változónak a címe, így a hívott eljárásban egy és ugyanaz a változó, mint a hívás helyén.

    Hogy hogy hívjuk, az már nekem mindegy, ha a sun simán érték szerintinek írja, ám legyen, nem ez a lényeg, hanem hogy értsük a működését. C#-ban egyébként létezik mind a három általam említett paraméterátadás, dehát ez nem az a topik. :))

  • Lortech
    addikt

    Ezt olvastam egy Sybex könyvben:

    --------------------
    Which of the following statements accurately describes how variables are passed to methods?
    A. Arguments are always passed by value.
    B. Arguments are always passed by reference.
    C. Arguments that are primitive type are passed by value.
    D. Arguments that are passed with the & operator are passed by reference.
    --------------------

    Boldogan bejelöltem az A-t, majd megnéztem a megoldást:

    C. Arguments are not always passed only by reference or only by value. It depends on the
    argument itself, and primitives are always passed by value. Java does not use the & operator
    to denote “pass by reference” as is done in the C programming language. See Chapter 1 for
    more information.

    Én azt gondolom, hogy mindig értékmásolás történik paraméterátadásnál, függetlenül attól, hogy objektum referencia vagy primitív típusú az átadni kívánt paraméter.

    Ha ''objektumot adunk át paraméterként'' akkor nem is az objektum a paraméter, hanem az objektum referencia, ami már ''by value'' kerül a metódusba.

    Mit gondoltok?


    Közben megnéztem a Sun site-ján (nyilván ott olvastam ezt) és bizony így van
    http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
    Úgyhogy ezt a Sybex könyvet el kell felejteni...

    Kérdés az, hogy mit tekintesz értéknek.
    Én azt mondtam volna, amit megadtak megoldásnak. De szó szerint véve elfogadható az A is, mivel egy objektum értéke a referenciája. (szintaktikailag)
    Ugyanakkor ha azt mondod, hogy referencia szerinti átadás van objektumoknál, szerintem akkor sem mondasz hülyeséget (sőt), mivel az az érték ami átadódik az egy referencia, így ugyanazt mondod, csak a referencia pontosabb megnevezés, bővebb jelentéssel bír, épp ezért ez utóbbit preferálom.

  • shev7
    veterán

    Ezt olvastam egy Sybex könyvben:

    --------------------
    Which of the following statements accurately describes how variables are passed to methods?
    A. Arguments are always passed by value.
    B. Arguments are always passed by reference.
    C. Arguments that are primitive type are passed by value.
    D. Arguments that are passed with the & operator are passed by reference.
    --------------------

    Boldogan bejelöltem az A-t, majd megnéztem a megoldást:

    C. Arguments are not always passed only by reference or only by value. It depends on the
    argument itself, and primitives are always passed by value. Java does not use the & operator
    to denote “pass by reference” as is done in the C programming language. See Chapter 1 for
    more information.

    Én azt gondolom, hogy mindig értékmásolás történik paraméterátadásnál, függetlenül attól, hogy objektum referencia vagy primitív típusú az átadni kívánt paraméter.

    Ha ''objektumot adunk át paraméterként'' akkor nem is az objektum a paraméter, hanem az objektum referencia, ami már ''by value'' kerül a metódusba.

    Mit gondoltok?


    Közben megnéztem a Sun site-ján (nyilván ott olvastam ezt) és bizony így van
    http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
    Úgyhogy ezt a Sybex könyvet el kell felejteni...

    szerintem meg teljesen jol, es erthetoen van leirva, nem ertem mi a gond? Az ertek es a referencia szerinti atadas kozott az a leglenyegesebb kulonbseg, hogy az eredeti ertek megvaltozik-e. Ha objektumot adsz at, es megvaltoztatod egy parameteret, akkor az eredetinek is valtozni fog. Marpedig ekkor a parameteratadas nem lehet ertek szerinti :)

  • robisz
    senior tag

    Köszönöm mindkettőtöknek,

    substring(startindex, startindex + 10)

    Így könnyen megjegyezhető.


    Közben találtam egy újabb ''fejfájást'':

    A Calendar osztály set metódusában a hónapok 0-tól kezdve számozódnak, míg az év és a nap természetesen 1-től indul :)

    De ezt csak mint érdekességet írom, nem fontos reagálni rá, és azt hiszem, abbahagyom a ''különös'' dolgok beírását a fórumba, talán fárasztó már, meg úgyis parttalan...


    A Calendar osztály set metódusában a hónapok 0-tól kezdve számozódnak, míg az év és a nap természetesen 1-től indul


    Igen ez tényleg furának nevezhető, de a Calendar osztály estében az előre definiált
    static konstansokat (JANUARY, FEBRUARY stb...) illik használni, innentől kezdve
    pedig édesmindegy hogy a január a háttérben 0 vagy 5000 :)

  • robisz
    senior tag


    Persze hogy egyértelmű. Az lenne a csuda, ha nem az lenne.

    Azonban cseppet sem logikus.

    Láthatod, a bemásolt leírásod is körmönfont:
    beginIndex-ről és endIndex-ről ír, holott a substring vége _nem_ az endIndex-nél van, hanem endIndex-1 -nél.

    Ugyanilyen ''logikával'' akár lehetne a string vége endIndex-17 -nél. Ekkor pl.
    substring(0,17)-re kapnánk meg az első karakterét a stringnek.



    [Szerkesztve]

    Ugyanilyen ''logikával'' akár lehetne a string vége endIndex-17 -nél. Ekkor pl.
    substring(0,17)-re kapnánk meg az első karakterét a stringnek.


    Lehet hogy elsőre furcsának tünik, de azért van benne némi logika :)
    Ha csíkokat rajzolsz a string karakterei közé így:
    | H | e | l | l | o |
    akkor a substring-nek azt kell megadni, hogy melyik két ''csík'' közötti részt
    kéred (0-tól kezdve az indexeket).

    További előny, hogy az endIndex és a startIndex különbsége így pont az
    eredmény hossza lesz. Tehát így is hasznáhatod:

    substring(startindex, startindex + 10)

    Ami visszaadja a startindex-től kezdődő 10 hosszúságú stringet.


    [Szerkesztve]

  • Protezis
    őstag


    Persze hogy egyértelmű. Az lenne a csuda, ha nem az lenne.

    Azonban cseppet sem logikus.

    Láthatod, a bemásolt leírásod is körmönfont:
    beginIndex-ről és endIndex-ről ír, holott a substring vége _nem_ az endIndex-nél van, hanem endIndex-1 -nél.

    Ugyanilyen ''logikával'' akár lehetne a string vége endIndex-17 -nél. Ekkor pl.
    substring(0,17)-re kapnánk meg az első karakterét a stringnek.



    [Szerkesztve]

    Itt van meg par erdekes eszrevetel a Javaval kapcsolatban: [link] ;)

  • shev7
    veterán

    Nézegetem a String osztály metódusait, és találtam valami furcsát.

    substring(start,end)

    Már az is eléggé furcsa, hogy a substring nem ilyen:
    substring(start,darab)

    Na de hogy az ''end'' 1-től számozódik!!!! Ez hihetetlen. Főleg annak tükrében, hogy a ''start'' meg 0-tól. Azért megkérdezném attól, aki ezt így találta ki, hogy mi volt az oka.

    Gondolom, az oka a Java nyelv elődeiben keresendő.
    Direkt megnéztem, C++-ban a substring(start, darab). Utánanéztem az Ada-nak, úgy láttam, az se ilyen ''elvetemült'', a slice-oknál tól-ig lehet megadni a pozíciót.


    hat pedig eleg egyertelmu a mukodese:

    ''Returns a new string that is a substring of this string. The
    substring begins at the specified <code>beginIndex</code> and
    extends to the character at index <code>endIndex - 1</code>.
    Thus the length of the substring is <code>endIndex-beginIndex</code>.''

  • robisz
    senior tag

    Ugye? Megfeküdtem, amikor arról olvastam, hogy az == és != másképp viselkedik
    Character, Short és Integer típusoknál -128..127 ig, míg a fölött és alatt.

    A gyakorlatban ugyan ennek vajmi kevés jelentősége van, mert az Integer
    érték egyenlőségét úgyis equals-al vizsgáljuk, de ez akkor is... meghökkentő :)

  • robisz
    senior tag

    Köszi, megnézem később. Most van egy könyvem, azon rágom át magam éppen.

    Ezt ismeri valaki?

    Kérdés: Mit ír ki a program? (Figyelem! Tilos begépelni és kipróbálni, előbb tippelni kell!)


    class Equal {
    public static void main(String[] args){
    Integer i,j;
    i=10; j=10;
    System.out.println(i==j);
    i=1000; j=1000;
    System.out.println(i==j);
    }
    }


    (Persze az igazi kérdés inkább az, hogy miért van ez így?)

    [Szerkesztve]

    false, false :)

    Tipikus autoboxing kérdés, amit így is meg lehet fogalmazni:

    while (i<=j && i>=j && i!=j) {
    ;
    }


    Hogyan deklaráljuk i-t és j-t hogy a fenti ciklus végtelen legyen?

  • Lortech
    addikt

    További ''érdekesség'' ebben a témában:

    Az eredeti kérdés ez volt:

    Az ugye világos, hogy ez

    ----------------
    int a = 10;
    int a = 10;
    ------------------
    Nem működik (already defined, mondja a compiler).

    És persze ez sem:
    -------------------------
    MyClass a = new MyClass();
    MyClass a = new MyClass();
    -------------------------
    Az érdekes viszont az, hogy így működik:
    for (int i=0; i<2; i++){
    int a = 10;
    };
    pedig itt is 2x van az ''int a = 10'' sor.

    A kérdés az volt, hogy lehet ez?


    Amit ''felfedeztem'', hogy van olyan eset, amikor minden végrehajtáskor készül egy új objektum!
    Legalábbis, ha osztályokról van szó:


    class MyClass { }

    class MoreMyClass {

    public static void main (String[] args){
    MyClass a = new MyClass();
    for(int i=0; i<2; i++){
    MyClass s = new MyClass();
    if (i == 0) a = s;
    System.out.println(i + '':'' + (a==s));
    }
    }
    }



    És az eredmény:


    0:true
    1:false


    Ami azt szemlélteti, hogy a ciklus második futásakor az s másik objektumra mutat, mint az első körben. (már, ha nem tévedek, persze)


    [Szerkesztve]

    [Szerkesztve]

    Referencia típusoknál mindig allokáció van.

    Ha így érdekel a téma, ajánlom áttanulmányozásra az alábbi írást és a kommenteket : [link]

  • loszerafin
    senior tag

    Találkoztam egy érdekes kérdéssel:

    Ez nem megy, mert a NetBeans hibát jelez:
    (n is already defined)
    --------------------
    int n = 10;
    int n = 10;
    --------------------

    Ez viszont fut, hiba nélkül:

    for (int i=0;i<2;i++){
    int n = 10;
    }

    Az a kérdésem, mi történik ilyenkor ? Az int n = 10 lefut kétszer?

    Előre is köszönöm
    KL

    A beszélgetéseteket olvasva rájöttem, hogy elég megnéznem a bytekódot:


    class MoreInt {

    public static void main(String[] args){
    for (int i=0; i<2; i++){
    int j = 10;
    }
    }
    }


    És a bytekód:

    Code:
    0: iconst_0
    1: istore_1
    2: iload_1
    3: iconst_2
    4: if_icmpge 16
    7: bipush 10
    9: istore_2
    10: iinc 1, 1
    13: goto 2
    16: return

    }



    A lokális változók számozva vannak, a j a kettes számú. A fordításkor ennek biztosít helyet a fordító, futáskor végig ezt a helyet használja.


    [Szerkesztve]

  • dantes
    tag

    Találkoztam egy érdekes kérdéssel:

    Ez nem megy, mert a NetBeans hibát jelez:
    (n is already defined)
    --------------------
    int n = 10;
    int n = 10;
    --------------------

    Ez viszont fut, hiba nélkül:

    for (int i=0;i<2;i++){
    int n = 10;
    }

    Az a kérdésem, mi történik ilyenkor ? Az int n = 10 lefut kétszer?

    Előre is köszönöm
    KL

    A {} blokkban deklarált változók csak a {} blokkon bellül érvényesek.
    Vagyis az történik, hogy lefoglal az n számára tárterületet, majd felszabadítja, megint lefoglalja és megint felszabadítja.
    De egy okos fordítóprogram ki is optimalizálhatja, és valójában nem csinál semmit.

  • robisz
    senior tag

    Mégsem világos.

    Ha SUNDAY, MONDAY, stb. objektumok jönnének létre (amik Day típusúak), akkor nem
    Day day = Day.MONDAY;

    sorral használnám, hanem
    Day day = MONDAY;

    sorral.

    A
    Day day = Day.MONDAY; ből inkább az következik,
    hogy már létezik egy Day osztály, aminek van egy MONDAY field-je, ami szintén Day típusú (!?)

    Esetleg a Day osztálynak SUNDAY,MONDAY, stb. alosztályai, de ezt nem gondoltam még végig....

    Persze, mondhatnánk, hogy ez teoretikus fejtegetés, de azt hiszem, hogy amíg az ember nem érti teljesen a dolgok működését (vagy legalább nincs egy jó modell a fejében), addig nem is tudja használni. A Java pedig a szerszámom lesz, jó, ha megismerem...


    A SUNDAY, MONDAY stb.. olyanok mintha a Day osztály statikus field-jei lennének,
    (a compiler azzá is alakítja őket a háttérben) ÉS egyúttal Day típusú objektumok.
    A kettő korántsem zárja ki egymást!
    Így már gondolom érthető a
    Day day = Day.MONDAY;
    írásmód, hiszen a Day osztály statikus field-jére hivatkozol, ami egy Day típusú
    objektum. Pontosan ahogy te is leírtad.
    Ha akarod írhatod így is:
    Day day = MONDAY;
    de akkor a statikus importot kell használnod:
    import static Day.*;
    és ezzel gyönyörűen visszakanyarodtunk a legelső kérdésedhez :)

    [Szerkesztve]

  • robisz
    senior tag

    Köszönöm, most már értem.

    Azaz az enum-ban levő konstansok-nak megfelelő objektumok jönnek létre, számszerint 7,
    ezek immutable-ek, és tölem függetlenül, a kódom elindulása előtt elkészülnek.

    Én a
    Day day = Day.MONDAY; sorral a már kész statikus objektumokat használom.

    Így az is érthető, hogy hogy tud működni a Day.values(); hiszen a már létrejött 7 objektumon végig tud menni rendszer.



    [Szerkesztve]

    Pontosan így van :R

    Az enum egy speciális osztály a Java-ban (ami egyébként a java.lang.Enum
    leszármazottja lesz) a benne szereplő ''konstansok'' pedig sima objektumok.
    Egyik nagy előnyük, hogy switch-ben is használhatóak.


  • robisz
    senior tag

    Köszi a választ, de a példámat értem, hiszen én hoztam létre.
    (Sőt, csináltam egy rövidke tutorialt, hátha elfelejteném vmikor:
    [link]
    )


    Egyedül az nem világos, hogy ki, mikor hívja meg a Day konstruktort, mert használat közben én nem hívom meg:

    Day day = Day.MONDAY;

    Olyat nem is enged a fordító, hogy
    Day day = new Day(''Monday'');

    Egyedül az nem világos, hogy ki, mikor hívja meg a Day konstruktort

    Ez is benne volt a válaszomban csak talán nem volt elég világos:

    A MONDAY(''Monday'') sor az enum kódjában egyenértékű az általad leírt
    konstruktorhívással. Olyan mintha statikus változót hoznál létre valahogy így:

    Day MONDAY = new Day(''Monday'');

    Tehát azzal hogy felsoroltad a 7 napot az enum-ban, egyúttal a konstruktor
    is meghívódott mind a 7 alkalommal.
    Kivülről nem tudsz új példányokat létrehozni az enum-ból, de nem is nagyon lenne értelme.

  • robisz
    senior tag

    Sziasztok
    Van egy kérdésem az enum típussal kapcsolatban:


    enum Day {
    SUNDAY (''Sunday''),
    MONDAY (''Monday''),
    TUESDAY (''Tuesday''),
    WEDNESDAY (''Wednesday''),
    THURSDAY (''Thursday''),
    FRIDAY (''Friday''),
    SATURDAY (''Saturday'');

    public final String dayname;

    Day(String dayname) {
    this.dayname = dayname;
    }
    public String toString(){
    return (this.dayname);
    }

    }


    Ez működik, meg használni is tudom. A kérdésem inkább elméleti jellegű:

    A constructor-nál nem világos a paraméter szerepe.
    ( Day(String dayname) )
    Hiszen így használom:


    Day day = day.SUNDAY;


    Akkor meg hogy kerül oda az a String dayname paraméter? Ez valami trükk, hogy a Java fordító az ilyen day.SUNDAY kifejezéseket átalakítja constructorhívássá, úgy hogy a SUNDAY-nak megfelelő szöveget (''Sunday''), odateszi paraméternek?
    Azt megfigyeltem, hogy a constructor-t csak a kellő számú, típusú és sorrendű paraméterrel lehet megírni.

    Persze használni kényelmes, de nem látom át, mi is történik itt valójában...

    Előre is köszönöm
    KL

    Szia!

    Az enum típusra úgy érdemes gondolni mint egy sima osztályra.
    Annyi a különbség, hogy ebből az osztályból közvetlenül sosem hozunk
    létre példányokat, csak az előre definiált ''konstansokat'' használhatjuk.

    A példában tehát létrejön egy Day ''osztály'' és annak a 7 példánya (SUNDAY,
    MONDAY, stb...)

    Legegyszerűbb formában tehát az enum így nézne ki:

    enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
    }


    Mint minden sima osztályban az enum-ban is írhatunk metódusokat, tárolhatunk
    egyéb adatokat.
    Alapból a toString() metódus a konstans nevével megegyező string-et ad vissza,
    tehát a System.out.println(Day.MONDAY) eredménye ''MONDAY''.

    A te példádban az enum-ban tárolunk egy dayname string-et is. Itt jön be
    a képbe a konstruktor szerepe. Igaz te kivülről sosem hivod közvetlenül a
    konstruktor-t, de a SUNDAY(''Sunday'') sor az enumban valójában egy konstruktor
    hívást jelent, azaz a ''Sunday'' string eltárolodik a dayname változóba.

    A toString metódust is felüldefiniálódik a te példádban, mégpedig úgy, hogy ezt a
    dayname String-et adja vissza. Igy a System.out.println(Day.MONDAY) eredménye
    ''Monday'' lesz ''MONDAY'' helyett.

    Azt hogy milyen adatokat tárolsz az enum-ben és milyen konstruktorokat írsz
    te döntöd el, csak a konstansok felsorolásánal (SUNDAY, MONDAY stb) a megfelelő
    számú és típusú paramétert kell átadni.


    [Szerkesztve]

  • robisz
    senior tag

    Sziasztok

    Elkezdtem tanulni a Java-t, és van egy kérdésem:

    Szeretném a PI konstansot használni a programomban.
    Ehhez a következő importot kell beírnom:

    import static java.lang.Math.*;

    Miért kell import static ? Miért nem jó :

    import java.lang.Math;
    import java.lang.Math.*;

    Egészen konkrétan a kérdésem:

    A
    import java.lang.Math;
    import java.lang.Math.*;

    sorok miért nem importálnak minden public dolgot? Miért kellett különbséget tenni
    a Java fejlesztésekor a konstansok és az osztályok/interfészek/metódusok importálása
    között?


    Előre is köszönöm
    KL

    Szia!

    A static import viszonylag új dolog a Java-ban az 1.5-től kezdve jött képbe.

    A hagyományos import arra jó, hogy a package név kiirása nélkül hivatkozhass
    osztályokra. Ha például azt írod, hogy

    import java.util.HashMap;

    akkor a kódban simán HashMap-ként hivatkozhatsz a java.util.HashMap osztályra.
    Az import java.lang.Math.*; értelmetlen, mivel az osztályon belüli dolgokat
    nem lehet beimportálni a sima importtal.

    A Math osztályra egyébként már eleve hivatkozhatsz rövid névvel, mivel az a java.lang package-ben van. Ez az egyetlen package amit soha nem kell beimportálni, mert mindig alapból be van importálva.
    Az ''régi'' import esetén tehát a package név elhagyható, de nem
    az osztálynév! Java 1.5 előtt tehát a PI konstansra úgy tudtál hivatkozni, hogy
    Math.PI

    Itt jön be a statikus import a képbe, mivel pont arra találták ki, hogy statikus
    változók használatakor ne kelljen beirni az osztály nevét sem.
    Ha tehát azt mondod, hogy
    import static java.lang.Math.PI;
    akkor attól kezdve sima PI-t irhatsz a kódban.

    Az interfészek, osztályok importja között nincs különbség.


    [Szerkesztve]

Új hozzászólás Aktív témák

Hirdetés