tag:blogger.com,1999:blog-35927116320042885582020-02-29T10:38:28.025+02:00JBottle | programavimas JavaKelionė į Java šalįVidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-3592711632004288558.post-80791244970955279942010-04-16T14:37:00.001+03:002010-04-16T14:40:20.288+03:00SHA-256 generavimasTrumpa Java klasė, iš duoto teksto sugeneruojanti SHA-256 hash'ą (kam to reikia, kur naudojamas, algoritmą, saugumo lygmenį ir pan. žr. <a href="http://en.wikipedia.org/wiki/SHA-2">http://en.wikipedia.org/wiki/SHA-2</a>):<br /><br /><pre class="brush:java">import java.security.*;<br /><br />public class Enc {<br /><br /> public static void main(String ... args) throws Exception {<br /> String sourceText = "PASSWORD";<br /><br /> MessageDigest md = MessageDigest.getInstance("SHA-256");<br /><br /> md.update(sourceText.getBytes());<br /> byte[] result = md.digest();<br /><br /> StringBuffer h = new StringBuffer();<br /> for (int i = 0; i < result.length; i++) {<br /> h.append(Integer.toHexString((result[i] >>> 4) & 0x0F));<br /> h.append(Integer.toHexString(result[i] & 0x0F));<br /> }<br /><br /> System.out.println("Computed hashcode: [" + h.toString() + "]");<br /> }<br /><br />}</pre><br />Internete taip pat radau JavaScript algoritmų implementaciją: <a href="http://jssha.sourceforge.net/">jssha.sourceforge.net/</a><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-36913910438906013792009-12-17T00:04:00.001+02:002009-12-17T00:06:23.080+02:00SCJP-6 06. Statiniai metodai per nuorodąTurime kodą:<br /><pre class="brush:java">void m1() {<br /> Integer z = null;<br /> z.toString(); // NullPointerException<br />}<br /><br />void m2() {<br /> Integer z = null;<br /> z.toString(12345); // ok<br />}<br /></pre><br />Kodėl vykdant <b>m1 </b>kils NullPointerException, o <b>m2 </b>-- nekils? Antru atveju <b>toString </b>metodas yra ne objekto metodas, o statinis (klasės) metodas <b>toString(int)</b> su argumentu <b>12345</b>. Kompiliavimo metu kreipinys <b>z.toString</b>(...) pakeičiamas kreipiniu <b>Integer.toString(...)</b> todėl vykdymo metu antru atveju problemų nekyla. Tačiau paprastai rekomenduojama statinius metodus kviesti naudojant klasės pavadinimą (taip pabrėžiant, kad metodas priklauso klasei, o ne objektui). Taigi <b>m2</b> metodo kodas tvarkingiau atrodytų taip:<br /><pre class="brush:java">void m2() {<br /> Integer.toString(12345);<br />}</pre><br />Egzamine, žinoma, gali pakliūti ir klausimų, kuriuose statiniai metodai kviečiami naudojantis nuorodos tipo kintamuoju, ir atvirkščiai -- naudojant klasės pavadinimą, bandoma iškviesti objekto metodą. Tad pravartu atsiminti, kokie yra dažniausiai sutinkamus metodai -- statiniai, ar objekto.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-81495533921296663432009-12-05T17:55:00.005+02:002009-12-05T18:04:53.644+02:00SCJP-6 05. ref instanceof Type[]<b><a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op2.html">instanceof</a></b> operatorius skirtas patikrinti, ar tam tikras nuorodos (<i>reference</i>) tipo kintamasis saugo reikšmę į vieno ar kito tipo objektą (tikrinamas IS-A ryšys). Pavyzdžiui:<br /><pre class="brush:java">Object o = new ArrayList(); // sukuriamas naujas objektas<br />boolean isList = o instanceof List; // reikšmė TRUE<br />boolean isArrayList = o instanceof ArrayList; // reikšmė TRUE<br />boolean isLinkedList = o instanceof LinkedList; // reikšmė FALSE<br />boolean isString = o instanceof String; // reikšmė FALSE<br />boolean isRunnable = o instanceof Runnable; // reikšmė FALSE<br />boolean isSerializable = o instanceof Serializable; // reikšmė TRUE</pre><br />Aukščiau pateiktame pavyzdyje <b>o</b> yra apibrėžtas kaip <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html"><b>Object</b></a> tipo kintamasis, todėl kompiliatorius kintamojo <b>o</b> tikrinimui netaiko jokių ribojimų: galima lyginti su visais klasių hierarchijoje esančiais tipais. Jei kintamasis <b>o</b> būtų apibrėžtas kaip <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html"><b>List</b></a> tipo nuoroda, kompiliavimo metu kiltų klaidos eilutėse 5, 7. Kompiliavimo metu kompiliatorius patikrina, ar tikrinamasis kintamasis ir taikomasis tipas priklauso tai pačiai objektų hierarchijos šakai. <a href="http://java.sun.com/docs/books/tutorial/figures/java/classes-object.gif">Kadangi tipas <b>Object</b> yra "pačiame viršuje"</a>, šio tipo kintamuosius galima lyginti su bet kokiais <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html">klasių</a>, <a href="http://java.sun.com/docs/books/tutorial/java/IandI/createinterface.html">interfeisų</a>, <a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html">masyvų</a> ir <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html">Enum</a> tipais (išskyrus anonimines klases, nes šių tipo tiesiogiai referuoti negalima).<br />Lyginimas su klasėmis nesudėtingas -- formatas<br /><pre class="brush: java">Serializable s = new Integer(123456);<br />boolean isInteger = s instanceof Integer;<br /></pre>Norint patikrinti, ar kintamasis rodo į masyvo tipo objektą, naudojama tokia sintaksė:<br /><pre class="brush:java">Object a = new int[10]; // masyvai yra objektai!<br />boolean isIntArray = a instanceof int[]; // TRUE<br />boolean isIntegerArray = a instanceof Integer[]; // FALSE</pre><br />Čia svarbu "momentas": masyvai gali būti polimorfiški. T.y. masyvo iš <i>k</i> tipo elementų kintamajam galima priskirti visus masyvus iš <i>m</i> tipo elementų, kai <i>m</i> tenkina "IS-A" (<i>yra</i>) ryšį <i>k</i> tipo atžvilgiu. Pavyzdžiai:<br /><pre class="brush:java">Number [] ni = new Integer[10]; // legalus priskyrimas, nes Integer paveldi iš Number<br />boolean isIntegerArray = ni instanceof Integer[]; // TRUE<br />boolean isNumberArray = ni instanceof Number[]; // TRUE<br />boolean isObjectArray = ni instanceof Object[]; // TRUE<br />boolean isLongArray = ni instanceof Long[]; // FALSE -- Integer nėra bendroje šakoje su Long<br />boolean isStringArray = ni instanceof String[]; // kompiliavimo klaida, nes String nėra bendroje hierarchijos šakoje su Number, todėl kompiliatorius šią situaciją sugeba aptikti</pre><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-12372184643756710172009-12-03T11:39:00.003+02:002009-12-04T00:44:30.565+02:00SCJP-6 04. Throwable, Collection, ComparatorEgzaminui labai svarbu atsiminti, kad <strong><a href="http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html">Throwable</a></strong> yra <u><strong>klasė</strong></u>, tuo tarpu <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a> ir <a href="http://java.sun.com/javase/6/docs/api/java/util/Comparator.html">Comparator</a> -- <strong><u>interfeisai</u></strong>. Pagal kai kurias rekomendacijas (pvz. žymiojoje <a href="http://www.amazon.com/gp/product/0071591060?ie=UTF8&tag=jbottlecom-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0071591060">Sierra ir Bates knygoje "SCJP for Java 6 Exam"</a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=jbottlecom-20&l=as2&o=1&a=0071591060" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin: 0px;" width="1" />), klases siūloma žymėti daiktavardžiais, o interfeisus -- būdvardžiais. Kai kuriais atvejais Java API taip ir daroma: klasės -- <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html">Object</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Date.html">Date</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Calendar.html">Calendar</a> (nors tai ir abstrakti, tačiau -- klasė). Interfeisai: <a href="http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html">Comparable</a>, <a href="http://java.sun.com/javase/6/docs/api/java/io/Serializable.html">Serializable</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/Runnable.html">Runnable</a>. Tačiau <a href="http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html">Throwable</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a> ir <a href="http://java.sun.com/javase/6/docs/api/java/util/Comparator.html">Comparator</a> (bei kitais -- <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html">Map</a> ir pan.) atvejais <strong>nesusipainiokit</strong>. Atminkit, kad interfeisai neturi konstruktoriaus (todėl objekto nepavyks sukurti naudojant <strong>new</strong>, išplėsti klase (tik interfeisu) ar kviesti statinius metodus. Lygiai taip pat klasės negali būti išplėstos interfeisu ar implementuotos. Žemiau -- <span style="color: red;"><strong>blogų</strong> pavyzdžių rinkinukas</span> <br /><pre class="brush:java">//BLOGI pavyzdžiai<br />List list = new List(); // nėra konstruktoriaus, interfeisas<br />class MyClass extends Collection {...} // bandoma išplėsti interfeisą klase<br />Collection.sort(...); // interfeisas neturi statinių metodų, supainiota su klase Collections<br /><br />interface MyThrowable extends Throwable {} // bandoma interfeisu išplėsti klasę<br />class MyThrowable implements Throwable {} // bandoma implementuoti klasę<br /><br /></pre><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-4595149995989069032009-11-29T14:22:00.004+02:002009-11-29T14:28:18.332+02:00SCJP-6 03. Dvigubas returnTurbūt savaime suprantama, kad Java kompiliatorius neleistų kompiliuoti tokio kodo:<br /><br /><pre class="brush:java">// DoubleReturnWrong.java<br />class DoubleReturnWrong {<br /> static int method() {<br /> return 1000;<br /> return 2000;<br /> }<br /> public static void main(String ... args) {<br /> System.out.println(method());<br /> }<br />}<br /></pre><br />Kompiliatorius aptiks, kad 5-oje eilutėje esantis <strong>return 2000;</strong> sakinys yra nepasiekiamas:<br /><br /><pre class="brush:bash">% javac DoubleReturnWrong<br />DoubleReturnWrong.java:5: unreachable statement<br /> return 2000;<br /> ^<br />1 error<br /></pre>Abejonių tikriausiai nekels ir šis kodas: <br /><pre class="brush:java">// DoubleReturn1000<br />class DoubleReturn1000 {<br /> static int method() {<br /> boolean flag = true;<br /><br /> if (flag) return 1000;<br /><br /> return 2000;<br /> }<br /><br /> public static void main(String ... args) {<br /> System.out.println(method());<br /> }<br />}<br /></pre>Kadangi metodas vykdomas iki pirmojo sutikto <strong>return</strong> sakinio, ir po to priverstinai nutraukiamas, šiuo atveju <em>method()</em> grąžins reikšmę 1000.<br /><br />Dabar -- subtilesnė situacija:<br /><br /><pre class="brush:java">// DoubleReturn.java<br />class DoubleReturn {<br /><br /> static int method() {<br /> try {<br /> return 1000;<br /> } finally {<br /> return 3000;<br /> }<br />}<br /><br /> public static void main(String ... args) {<br /> System.out.println(method());<br /> }<br />}</pre><br />1000 ar 3000? Pagal ankstesnį pavyzdį būtų logiška tikėtis, kad rezultatas -- 1000. T.y. grąžinama pirmo pasiekto <strong>return</strong> reiškmė. Tačiau šiuo atveju antrasis <strong>return</strong> yra <strong>finally</strong> bloke, kuris privalo būti įvykdytas <u>bet kuriuo atveju, išskyrus System.exit() ar panašų visišką programos nutraukimą ankstesnėje <strong>try {...}</strong> arba <strong>catch(...) {...}</strong> dalyje, esančioje prieš <strong>finally</strong> bloką</u>. Taigi, po <strong>return 1000</strong> vykdymas pratęsiamas <strong>finally</strong> dalyje, kurioje tėra kitas <strong>return</strong> sakinys su reikšme<strong> 3000.</strong> Kaip elgsis JVM šiuo atveju? Ar šiuo atveju bus kaip su <em>finalize()</em> metodu (prisimenam, kad <em>finalize</em> gali būti JVM <u>automatiškai</u> įvykdytas <strong>ne daugiau kaip vieną kartą</strong>. T.y. nėra ribojama, kiek kartų jis bus iškviestas iš kodo naudojant tiesioginį kvietinį, pvz. <em>myObject.finalize()</em>, tačiau nepriklausomai nuo to JVM vis tiek <em>gali</em> vieną kartą iškviesti šį metodą prieš objekto "sunaikinimą", bet ne daugiau. Su <em>finalize</em> metodu yra niuansas -- metodas automatiškai iškviečiamas prieš objektą sunaikinant, tačiau šio metodo kodas gali sukurti "gyvą" nuorodą į objektą, ir taip apsaugoti jį nuo sunaikinimo. Tačiau tokiu atveju, kai objektas vėl pataps potencialiai naikinamu, JVM daugiau <em>finalize</em> metodo jam neiškvietinės), t.y. JVM yra "pažymėjus", kad metode jau buvo įvykdytas <strong>return</strong> sakinys?<br />Atsakymas -- ne. Rezultatas bus <strong>3000</strong>. Kyla klausimas -- o kodėl? Patikrinkim "išdizassemblintą" kodą:<br /><br /><pre class="brush: bash">% javap DoubleReturn<br />Compiled from "DoubleReturn.java"<br /><br />public class DoubleReturn extends java.lang.Object{<br />public DoubleReturn();<br /> Code:<br /> 0: aload_0<br /> 1: invokespecial #1; //Method java/lang/Object."<init>":()V<br /> 4: return<br /><br />static int method();<br /> Code:<br /> 0: sipush 1000<br /> 3: istore_0<br /> 4: sipush 3000<br /> 7: ireturn<br /> 8: astore_1<br /> 9: sipush 3000<br /> 12: ireturn<br /><br /> Exception table:<br /> from to target type<br /> 0 4 8 any<br /> 8 9 8 any<br /><br />public static void main(java.lang.String[]);<br /> Code:<br /> 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;<br /> 3: invokestatic #3; //Method method:()I<br /> 6: invokevirtual #4; //Method java/io/PrintStream.println:(I)V<br /> 9: return<br />}<br /></pre><em>Kol kas</em> nesu <a href="http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/">Java bytecode</a> specialistas, tačiau iš aukščiau pateikto <em>listingo</em> aiškėja seka, kuria vykdomas metodas <em>method</em>:<br />1. į steką įdedama 1000 (0-is metodo kodo adresas, <strong>sipush 1000</strong>)<br />2. šokama į 4-ą adresą pagal <em>Exception Table</em> (šioje vietoje <em>spėju</em>, kad taip vyksta)<br />3. į steką įdedama 3000 (4-as kodo adresas, <strong>sipush 3000</strong>)<br />4. grįžtama iš metodo su reikšme steke -- 3000 (7-ame kodo adrese esanti komanda <strong>ireturn</strong>)<br /><br />Taigi kaip matome iš sukompiliuoto <em>bytecode</em>, <strong>return</strong> reikšmė yra talpinama steke, ir paskutinė iš jų -- grąžinama.<br />Egzamine neteko matyti šį "kabliuką" turinčio klausimo, bet tai nereiškia, kad negali pakliūti kam nors kitam.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-63768714519390231222009-11-22T12:49:00.004+02:002009-11-22T12:58:15.642+02:00SCJP-6 02. Failų su klasėmis vardai ir metodas main()Keletas mano pastebėjimų apie failų vardus bei metodą <i>main()</i>.<br /><br />Kiekvienas išeities failas (source-file) su plėtiniu <i>.java</i> gali turėti savyje daug deklaruotų klasių. Tačiau -- ne daugiau kaip vieną <b>public</b> klasę. Jos gali ir nebūti (!), bet jei<b> public</b> klasė apibrėžta, tuomet jos vardas turi sutapti su failo vardu (be plėtinio), kuriam klasė deklaruota. T.y. jei turime public klasę "<i>Gyvis</i>", ir tris kitas, <b>package</b> matomumo klases (pvz. "<i>Briedis</i>", "<i>Begemotas</i>" ir "<i>Vandenynas</i>"), tai visas šis ketvertas privalo būti patalpintas "<i>Gyvis.java</i>" faile. Jei <b>public </b>klasės nėra -- failo pavadinimas griežtų taisyklių neturi. Nepaisant to, abiem atvejais sukompiliavę išeities kodą gausime keturis atskirus <i>.class</i> failus (<i>Gyvis.class</i>, <i>Briedis.class</i>, <i>Begemotas.class</i> ir <i>Vandenynas.class</i>):<br /><br /><pre class="brush:java">// Failo vardas privalo būti Gyvis.java<br />//Ne daugiau viena klasė gali būti deklaruota public<br />public abstract class Gyvis {}<br />class Briedis extends Gyvis {}<br />class Begemotas extends Gyvis{}<br />class Vandenynas {}</pre>bei<br /><pre class="brush:java">// Failo vardas gali būti SCJP_1.java<br />abstract class Gyvis {}<br />class Briedis extends Gyvis {}<br />class Begemotas extends Gyvis{}<br />class Vandenynas {}</pre><br />Metodas <i>main()</i>. Norint, kad JVM rastų šį metodą ir pradėtų programos vykdymą, jis privalo būti viešas (<b>public</b>), statinis (<b>static</b>) ir kaip parametrą naudoti eilučių masyvą (<i><b>String [] args</b></i>) arba, nuo Java 5, leisti perduoti nefiksuoto ilgio argumentų sąrašą (<b><i>String... args</i></b>).<br />Niuansai, kuriuos verta pastebėti:<br /><ul><li>nors ir statinis (t.y. "nepperrašomas" -- <i>not overrideable</i>) metodas gali būti apibrėžtas kaip "<b>final</b>". Prasmė? Neleisti paveldinčiai klasei apibrėžti metodo tokiu pačiu vardu, ir tokiu būdu "paslėpti" esančiojo aukštesnėje klasėje (prisimenam, kad kalba eina apie statinius metodus, ne paprastus, <i>instance</i> metodus, todėl perrašymas -- <i>override</i> -- neegzistuoja). <a href="http://www.coderanch.com/t/403468/Beginning-Java/java/static-final-methods">Šiuo klausimu diskusija buvo pradėjusi megztis JavaRanch forume</a>.</li><li> klasei nebūtina pačiai turėti statinį <i>main()</i> metodą. Užtenka, kad jis bus realizuotas kuriame nors iš "protėvių".</li></ul>Apibendrinant:<br /><pre class="brush:java">// Failas KeliosKlases.java<br />class GrandParent {<br /> final public static void main(String ... args) {<br /> System.out.println(">>> Tai yra GrandParent klasės main(...) metodas");<br /> }<br /> class Parent extends GrandParent {}<br /> class MyClass extends Parent {}<br />}</pre>Kompiliuojam ir vykdom MyClass:<br /><pre class="brush:bash">javac<br />KeliosKlases.java<br /><br />java MyClass<br />...<br />> Tai yra GrandParent klasės main(...) metodas</pre><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-10678084859867047922009-11-20T22:51:00.001+02:002009-11-20T22:58:30.042+02:00SCJP-6 01. Primityvų suderinamumasJava turi aštuonis <a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html">primityviuosius duomenų tipus</a>:<br /><br /><ul><li>byte</li><li>short</li><li>int</li><li>longint</li><li>float</li><li>double</li><li>char</li><li>boolean</li></ul><br />Kiti duomenų tipai (įskaitant eilutes -- <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>) yra <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html">klasės</a>/<a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html">masyvai</a>/<a href="http://java.sun.com/docs/books/tutorial/java/IandI/createinterface.html">interfeisai</a>/<a href="http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html">enum</a>, o visų jų realizacijų (arba paprasčiau tariant, objektų) hierarchijos viršūnėje stovi <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html">Object</a> klasė.<br />Primityvieji duomenų tipai skirti saugoti konkrečią skaičiaus išraišką, išskyrus <b>boolean </b>tipą -- jis reprezentuoja vieną iš dviejų reikšmių (<b>true</b> arba <b>false</b>). Verta pastebėti, kad nors tipiškai <b>char </b>duomenų tipo kintamiesiems priskiriami simboliai, iš tiesų simbolių išraiška tėra kita skaičiaus išraiška. Todėl šis kodas -- teisingas:<br /><br /><pre class="brush: java">int intHoldingChar = 'X';<br />char charHoldingNumber = 123;<br /></pre><br />Kitas dalykas -- vieni duomenų tipai gali talpinti skaičius iš platesnio rėžio, kiti -- iš siauresnio. Pavyzdžiui, <b>byte </b>duomenų tipui saugu priskirti reikšmes nuo -128 iki 127, o <b>short </b>-- nuo -32768 iki 32767. Akivaizdu, kad <b>short</b> tipo kintamajam visada saugu priskirti <b>byte</b> kintamojo reikšmę, bet ne atvirkščiai (nes <b>short</b> tipo kintamojo reikšmė gali išeiti iš <b>byte</b> tipui leidžiamų reikšmių rėžio). Antru atveju Java kompiliatorius reikalauja aiškaus tipo pažymėjimo (<i>casting</i>), nepaisant to, kad pati reikšmė ir patenka į leidžiamą rėžį:<br /><br /><pre class="brush:java">short s = 123;<br />byte b1 = (byte) s; // viskas gerai<br />byte b2 = s; // kompiliavimo klaida<br /></pre><br />Kada yra saugu priskirti reikšmę tiesiogiai, o kada reikalingas <i>casting</i>'as?<br /><br /><b>double <- float <- long <- int <- (char, short <- byte)</b><br /><br />Sekoje rodyklėmis pažymėta saugi priskyrimo kryptis -- t.y.<b> int</b> reikšmę galima tiesiogiai priskirti<b> double </b>tipo kintamajam. Duomenų tipo <b>char</b> rėžis yra 0...65536, tad jo reikšmę saugiai galima priskirti tik <b>int</b> arba aukštesnio tipo kintamajam. Tuo tarpu <b>char</b> kintamajam tiesiogiai negalima priskirti jokio kito tipo kintamojo reikšmės, mat net pats mažiausias <b>byte</b> tipo kintamasis potencialiai gali saugoti neigiamą skaičių (o <b>char</b> tipo kintamieji gali saugoti tik neneigiamus skaičius).<br />Todėl teisingi šie kodo pavyzdžiai:<br /><br /><pre class="brush:java">// aiškus tipo pažymėjimas nebūtinas (bet nedraudžiamas)<br />byte b = 123;<br />short s = b;<br />int i = s;<br />int i2 = b;<br />long lng = b;<br />long lng2 = i2;<br />double d = b;<br />float f = lng;<br /><br />// aiškus tipo pažymėjimas privalomas<br />byte xb = (byte) lng;<br />byte xb2 = (byte) d;<br />int xi = (int) f;<br /><br /></pre><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-37192517279830194062009-11-19T23:37:00.001+02:002009-11-19T23:44:20.876+02:00Unix komandos Windows aplinkojeUnix, Linux, BSD sistemos "iš prigimties" turi labai naudingų "utilitų": grep, tar, diff, cat, find, ls, head, tail... "<em>too many to mention here</em>". Norite turėti visa tai savo Windows sistemoje? Reikėtų. Geras būdas: viską parsisiųsti iš GnuWin32 tinklapio: <a href="http://gnuwin32.sourceforge.net/">http://gnuwin32.sourceforge.net/</a>.<br /><br />Alternatyvus būdas: <a href="http://www.weihenstephan.de/~syring/win32/UnxUtilsDist.html">http://www.weihenstephan.de/~syring/win32/UnxUtilsDist.html</a>. Bet man atrodo, šis paketas jau gerokai pasenęs.<br /><br />Sveikintinas būdas: instaliuoti (ant realios arba virtualios mašinos) Linux/FreeBSD ar pan.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com2tag:blogger.com,1999:blog-3592711632004288558.post-42939027002554063842009-11-18T16:22:00.003+02:002009-11-18T17:13:14.287+02:00SCJP-6 00. Nuo ko pradėti?Pradžių pradžia -- <a href="http://www.sun.com/training/certification/why_sun.html">ar to reikia</a>? Priklauso nuo to, kas esat, ko norit ir ko tikitės. Jei norit įsigilinti į Javos sintaksės ir semantikos niuansus -- taip. Jei norit dirbti būdami labiau užtikrinti savo kodo teisingumu/kokybe -- taip. Jei norit pasididžiuoti prieš kitus geru SCJP rezultatu -- taip. Jei norit įrodyti sau ir darbdaviui, kad esat žmogus, kuris nebijo iššūkių (o SCJP yra šiaip jau nemažas iššūkis) -- taip. Jei dairotės darbo už Lietuvos ribų -- taip. Jei neturit ką veikti... Gal. Jei <a href="http://vidmantas.blogspot.com/2009/11/pardaveju-poziuris.html">dirbat pardavėju</a> -- vargu.<br />Pradėti verta nuo susipažinimo su <a href="http://www.sun.com/training/catalog/courses/CX-310-065.xml">sertifikacijos reikalavimais</a>. Tai leidžia suvokti, ko tikėtis tiek mokantis, tiek egzamino metu:<br /><ul><li>1 dalis: apibrėžimas (declarations), inicializacija (Initialization) ir galiojimo ribos (Scoping)</li><li>2 dalis: vykdymo eigos kontrolė (Flow Control)</li><li>3 dalis: bazinės API žinios (API Contents)</li><li>4 dalis: lygiagretus vykdymas (Concurrency)</li><li>5 dalis: objektiškai orientuoto programavimo esminiai dalykai (OO Concepts)</li><li>6 dalis: kolekcijų API, generics'ai (nežinau lietuviško atitikmens, gal vertėtų vadinti "bendrizmas"?) (Collections / Generics)</li><li>7 dalis: pagrindai (Fundamentals)</li></ul>Išlaikę egzaminą gausite lapą, kuriame surašyta kiekvienos dalies teisingai atsakytų klausimų procentas.<br /><br />Dabar, kai egzamino sandara žinoma -- laikas išsiaiškinti, kaip jam ruoštis ir kur laikyti. Egzaminai laikomi <a href="http://www.prometric.com/">Prometric</a> egzaminavimo centruose (Vilniuje jų yra keletas, yra bent vienas ir Kaune). Ateinate į egzaminą, gaunate kelis popierinius arba plastikinius lapus užrašams, rašiklį, ir trims valandoms sėdate prie kompiuterio su specialia programa. Joje žymėsite "checkboxus", "radio" ir "tampysite" teisingus atsakymus į paliktus laisvus laukelius. Kuponą ("bilietą") egzamino laikymui iš anksto galima užsisakyti pvz. <a href="http://www.bka.lt/">Baltijos Kompiuterų Akademijoje</a> (akredituotame <a href="http://www.prometric.com/">Prometric</a> centre) arba <a href="http://proact.lt/">UAB "Proact Lietuva"</a>.<br />O kaip egzaminui ruoštis? Skaityti tutorial'us, knygas (ypatingai <a href="http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060">egzaminui skirtą Katherine Sierra ir Bert Bates knygą</a>), <i>rašyti daug kodo</i>, spręsti bandomuosius egzaminus, domėtis Java ir sveikai maitintis :)<br /><br />Knygą nusipirkit arba elektroninę versiją susiraskit patys.<br /><br />Programavimui reikia minimaliai paruošti savo kompiuterį. Sakote, turite <a href="http://www.eclipse.org/">Eclipse</a> arba <a href="http://netbeans.org/">NetBeans</a>? Siūlau juos naudoti darbe, bet ne ruošiantis egzaminui. <i>Autocomplete </i>ir <i>Autobuild</i> yra nuostabūs dalykai dirbant, tačiau mokantis jie tik trukdys įsisavinti kai kuriuos būtinus egzamine gerai išmanyti dalykus.<br /><br />Taigi, instaliuojame:<br />- <a href="http://www.farmanager.com/">FAR Manager</a>, <a href="http://www.ghisler.com/">Total Commander</a> ar panašų "old-school" įrankį. Nebūtina, tačiau patogu, nes suteikia galimybes patogiai dirbti su archyvais (JAR -- tai yra paprasta ZIP failas su tam tikra meta informacija), turi komandinę eilutę ir paprastą bei GREITĄ failų redagavimo/peržiūros galimybę.<br />- prie FAR Manager -- instaliuojam <a href="http://7-zip.org/download.html">7-Zip</a> ir <a href="http://colorer.sourceforge.net/farplugin.html">Colorer</a> priedus (plugins).<br />- <a href="http://notepad-plus.sourceforge.net/">notepad++</a><br />- <a href="http://java.sun.com/javase/downloads/widget/jdk6.jsp">Java SDK</a><br /><br />Susitvarkome $PATH arba %PATH% ("Environment variable"), t.y. įdedam "java_pagrindinis_katalogas"/bin ir patikrinam, ar iš komandinės eilutės galim sukompiliuoti Hello World:<br /><br /><pre class="brush: java">class HelloWorld {<br /> public static void main(String ... args) {<br /> System.out.println("Hello, Java World, I am coming!");<br /> }<br />}<br /></pre><br /><br />Klausiate, kokiu vardu išsaugoti šį failą? Galite kad ir PirmaPrograma.java -- kadangi klasė nėra "public", reikalavimas, kad failo vardas sutaptų su klasės pavadinimu, negalioja.<br /><br />Taigi, pasileidžiam Far Manager, Total Commanger (arba Command Prompt, arba Unix/Linux/Solaris konsolę -- priklausomai, kokia pas jus OS ir ką turit):<br /><br /><pre class="brush: bash">$ javac PirmaPrograma.java<br />$ java HelloWorld<br /></pre><br /><br />ir patikrinam, ar konsolėje išspausdinamas reikalingas tekstas. Gera pradžia -- pusė darbo :)<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-26680726621985350952009-11-17T17:15:00.004+02:002009-11-17T17:58:58.983+02:00Sintaksės išryškinimas Blogspot sistemojeKadangi gaminti paveiksliukus ar rankomis keisti kodo spalvą nėra pats įdomiausias, patogiausias ir greičiausias būdas tvarkingai pateikti gabaliuką kodo Blogger tinklaraščiuose, <a href="http://blog.webunusual.com/2009/02/enlight-your-blogger-with.html">pasinaudojau kitų autorių patarimais</a> ir sukonfigūravau sistemą taip, kad būtų galima naudoti <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter">SyntaxHighlighter</a>.<br />Štai kaip atrodo Java kodas dabar:<br /><pre class="brush: java">public class HighlightedClass {<br /> private String firstname;<br /> private String lastname;<br /><br /> public HighlightedClass(String firstname, String lastname) {<br /> this.firstname = firstname;<br /> this.lastname = lastname;<br /> }<br /><br /> public String toString() {<br /> return firstname + " " + lastname;<br /> }<br /><br /> public static void main(String ... args) {<br /> System.out.println(new HighlightedClass("JBottle", "Blogspot"));<br /> }<br />}<br /></pre><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com1tag:blogger.com,1999:blog-3592711632004288558.post-68307204890773309312009-11-16T20:16:00.000+02:002009-11-16T20:16:40.315+02:00"welcome back"Nuo praėjusios žiemos pabaigos buvo visokių "skubių reikalų" (magistrinio baigiamojo darbo rašymas, domėjimasis kitais aktualiais dalykais, egzaminai paralelinėse studijose, darbas...), tad SCJP egzaminą teko kuriam laikui atidėti. Tačiau pasibaigus vasarai, entuziazmas sugrįžo ir atnešė visai neblogą rezultatą -- 96% atsakytų SCJP-6 klausimų (58 iš 60). Besiruošdamas egzaminui išsiaiškinau daug įdomių dalykų, Java kalbos subtilybių, galimybių ir ypatumų. Tad dabar bus apie ką rašyti ilgam, ir tikiuosi, šįkart entuziazmas dalintis informacija (kaip ruoštis SCJP ir ne tik) neišblės.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-89940214987675652122009-02-22T15:29:00.013+02:002009-02-22T19:39:04.054+02:00JavaBeansPrisipažinsiu: visą laiką galvojau, kad <a href="http://java.sun.com/javase/technologies/desktop/javabeans/index.jsp">JavaBeans</a> -- tai tiesiog susitarimas klasėse laukelius (<i>fields</i>) apibrėžti kaip privačius (<i>private</i>) objekto kintamuosius, o jų "išviešinimui" naudoti vieną arba abu "get/set" tipo metodus.<br /><div style="text-align: left;">T.y. kažkas panašaus į</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_rIjhqTbv5X8/SaFfas6hHtI/AAAAAAAAAWI/ZtdNQfXbU6E/s1600-h/JavaBean-01.png"><img src="http://3.bp.blogspot.com/_rIjhqTbv5X8/SaFfas6hHtI/AAAAAAAAAWI/ZtdNQfXbU6E/s320/JavaBean-01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5305626748356992722" style="cursor: pointer; width: 311px; height: 320px; " /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">Pasirodo, viskas gerokai sudėtingiau. JavaBeans -- tai komponentinės architektūros technologija, leidžianti kurti įvairius nepriklausomus komponentus, kurie gali būti pakartotinai panaudojami (<span style="font-style:italic;">re-used</span>) kitose programose/sistemose.</div>Visų pirma, JavaBean "pupa" turi atitinkti tam tikrus "šablono" reikalavimus (O'Reilly knygos "Java in a Nutshell" <a href="http://docstore.mik.ua/orelly/java-ent/jnut/ch06_02.htm">6.2 skyrius apie JavaBeans</a>). Be set/get metodų dar reikia paminėti "įvykių" (<span style="font-style:italic;">events</span>) registravimo ir informavimo mechanizmą (<span style="font-style:italic;">listeners</span>), skirtą komponentų tarpusavio komunikacijai, bei <a href="http://java.sun.com/developer/technicalArticles/Programming/serialization/">serializavimą</a>/<a href="http://www.builderau.com.au/program/java/soa/Understand-when-to-serialize-v-externalize-objects-in-Java/0,339024620,339274531,00.htm">eksternalizavimą</a> (<span style="font-style:italic;">serialization</span>/<span style="font-style:italic;">externalization</span>).<br />Antra, šiek komponentai gali būti registruojami įvairiuose komponentų surinkimą palaikančiuose IDE ar panašiose sistemose, bei "vizualiai" komponuojami į sudėtingesnius vienetus. Panašiai, kaip daugelis <a href="http://en.wikipedia.org/wiki/Rapid_application_development">Rapid Application Development</a> sistemų leidžia dirbti su <a href="http://en.wikipedia.org/wiki/GUI_widget">vartotojo sąsajos komponentais</a>.<br />Ir trečia, JavaBeans modelis yra labai plačiai naudojamas paties <a href="http://www.sun.com/">SUN</a> produktuose: tiek <a href="http://en.wikipedia.org/wiki/GUI_widget">AWT</a>/<a href="http://java.sun.com/docs/books/tutorial/uiswing/">Swing</a> bibliotekose, tiek <a href="http://java.sun.com/javaee/">Java EE</a> technologijoje.<div>Susipažinimui su technologija rekomenduoju paskaityti <a href="http://java.sun.com/docs/books/tutorial/javabeans/index.html">SUN JavaBeans Tutorial</a> ir atkreipti dėmesį į <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/package-summary.html">java.beans</a> API paketą.</div><div><br /></div><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com2tag:blogger.com,1999:blog-3592711632004288558.post-77363867004498471012009-02-21T22:00:00.000+02:002009-02-22T19:38:01.738+02:00Nemokami JAVA kursaiPrieš susirasdamas knygą, specialiai ruoštą egzaminui, ieškojau įvairių rimtam Java mokinimuisi skirtų kursų internete. Reikalavimas -- apžvelgti kalbos sintaksines ir semantines "smulkmenas" bei "niuansus". <a href="http://www.sun.com/">SUN</a> siūlo savo oficialius komercinius mokymus <a href="http://www.sun.com/training/certification/java/prepare_scjp.html">tiek elektroniniame pavidale, tiek auditorijose</a>, tačiau manęs netenkina kaina ir (auditorinių kursų atveju) mokymosi vieta bei laikas. Tad kiek paieškojęs radau visai įdomų profesoriaus Sang Shin puslapį Java Passion (<a href="http://www.javapassion.com/">www.javapassion.com</a>). Jame –- visas asortimentas nemokamų Java technologijų kursų. Ilgesnieji skirti rimtoms studijoms, leidžiančioms technologiją taikyti praktikoje: <ul> <li>Java Programming (with Passion!)</li><li>Performance, Debugging, Testing, Monitoring, and Management (with Passion!)</li><li>Advanced Java Progamming (with Passion!) - work in progress</li><li>Java EE Programming (with Passion!)</li><li>Ajax Programming (with Passion!)</li><li>Web Services Programming (with Passion!)</li><li>Identity Manager (with Passion!)</li><li>Java FX Programming (with Passion!)</li><li>Ruby/JRuby/Rails Development (with Passion!)</li><li>Social Networking (Facebook) Application Development (with Passion!) - work in progress</li><li>Groovy and GRails (with Passion!) - work in progress</li><li>Java ME Mobility Programming (with Passion!) - work in progress</li></ul>Taip pat yra daug „trumpų“ (1-5 dienų trukmės) kursų, kurie skirti supažindinimui su konkrečia technologija. Susidomėjęs šiuo metu „mokausi“ patį pirmąjį. Beje, tai nėra „web-casts“ ar panašios video/audio transliacijos, jau įprastos WEB 2.0 pasaulyje. Naudojama konservatyvesnė medotika. Kursas susideda iš PDF (arba ODF) formatu pateiktos prezentacijos, apibendrinančios pamokos medžiagą, išorinių nuorodų į SUN Tutorial skyrelius bei straipsnius kituose tinklapiuose, reikalingus suprasti ir įsisavinti žinias. Taip pat patiekiama praktinė dalis, sudaryta iš kelių užduočių ir namų darbo. Rekomenduojama naudoti NetBeans integruotą aplinką, nors namų darbų užduotis galima atlikti ir kitomis priemonėmis. Kurso tvarkaraštis – atviras, tai yra klausytojas gali bet kada pradėti ir bet kada baigti mokymąsi, nors tam tikros rekomendacinio pobūdžio gairės namų darbams yra nustatytos. Trumpa "<a href="http://www.javapassion.com/javaintro/">Java Programming (with Passion!)</a>" apžvalga:<ol><li>Getting started</li><li>Learning the basics of Java language</li><li>Classes and Objects</li><li>Object-Oriented Programming (OOP) concepts</li><li>Learning the advanced features of Java language</li><li>IDE</li><li>Collections framework</li><li>GUI programming</li><li>I/O & Networking & Database</li><li>Threading </li><li>J2SE 5.0 Features</li></ol><div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-69381453572055223912009-02-19T22:25:00.002+02:002009-02-19T22:28:11.096+02:00Norite sukurti kompiliatorių .NET aplinkai?....tuomet galite perskaityti <a href="http://msdn.microsoft.com/en-us/magazine/cc136756.aspx">šį straipsnelį MSDN'e</a>. Tiesiog dėl įdomumo.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com0tag:blogger.com,1999:blog-3592711632004288558.post-29952868799209552952009-02-19T04:32:00.006+02:002009-02-22T16:37:59.903+02:00IdėjaBeskaitydamas įvairius programuotojų BLOG'us, aptikau gerą naujieną. <a href="http://www.sun.com/training/savings/retake.xml">SUN paskelbė</a>, kad siekiantys sertifikuotis specialistai egzamino neišlaikymo atveju nemokamai gaus antrą šansą. Mane dominantis egzaminas -- <a href="http://www.sun.com/training/catalog/courses/CX-310-065.xml">CX-310-065</a>, dar vadinamas SCJP (Sun Certified Java Programmer). Įprasta kaina -- 300 JAV dolerių, tad nesėkmės atveju SUN akcijos nauda akivaizdi.<br />Sertifikacijos "bilietą" reikia nusipirkti iki 2009 metų balandžio 30. Jis galioja, atrodo, 12 mėnesių nuo pirkimo datos, ir egzaminą galima laikyti patogiu metu bet kuriame akredituotame Prometric centre.<br />Ką gi... Pats laikas pagalvoti apie oficialaus "popieriaus" gavimą. Ta proga savo įspūdžiais dalinsiuosi ir su kitais, kuriems ši informacija gali praversti ateityje.<br />Pačiam su Java teko dirbti apie 3 metus, tad įdirbis yra. Tačiau SCJP turinys stipriai skiriasi nuo to, su kuo tenka susidurti kasdien darbe. Programuotojas, SUN nuomone, turi mokėti rašyti kodą ant popieriaus, atlikti sintaksinę kodo analizę ir sugebėti mintyse vykdyti paruoštą programą. Arba, paprastai tariant, egzamine "gaudoma" ant detalių ir JAVA niuansų.<br />Egzaminui ruoštis tikslinga naudojantis specialiai tam skirtas knygas. Viena jų, matyt, populiariausia -- tai "McGraw Hill" išleista "SCJP Sun Certified Programmer for Java 6 Study Guide. Exam (310-065)". Su kiekviena nauja egzamino versija knyga atnaujinama. Knyga sudaryta iš 10 skyrių, dengiančių visus egzamino reikalavimus. Tad imam į rankas, ir pradedam skaityti.<div class="blogger-post-footer">--
http://jbottle.blogspot.com
http://www.linkedin.com/in/maskoliunas</div>Vidmantas Maskoliunashttp://www.blogger.com/profile/03268224439677392174noreply@blogger.com2