Įvadas į Java programavimo kalbą 2 paskaita
Masyvai Saugesni nei C ar C++ kalbose, nes tikrina indekso išėjimą už masyvo ribų; tikrina ar masyvui išskirta vieta. Pirmasis masyvo narys yra indeksu 0, o ne indeksu 1 (kaip, pvz., Pascal’yje). Masyvas yra objektas, o ne vien tik atminties blokas. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ304.htm#Heading1433 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/04.HTM
Masyvų inicializavimas Masyvas yra vienodo tipo kintamųjų ar objektų seka. Jis aprašomas tokiu būdu: int[] masyvas = null; arba int masyvas[] = null; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ306.htm#Heading4560 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/04.HTM
Masyvo vietos išskyrimas Galima išskirti masyvui vietą iš anksto nepriskiriant masyvo elementų, o tik nurodant masyvo dydį: double[] values = new double[10]; Kitas būdas – iš karto priskirti masyvo narius: double[] values = {2.5, -3.4, 11, 0.65}; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ306.htm#Heading4560 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/04.HTM
Kelių dimensijų masyvai Java kalboje masyvo dimensijų kiekis nėra apribotas. Todėl galima kurti dvimačius, trimačius ir, reikalui esant, n-mačius masyvus. Reiktų paminėti, kad masyvo dydį galima nurodyti ne iš karto. int[][] matrix = new int[20][30]; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ306.htm#Heading4731 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/04.HTM
Masyvų pavyzdys Integer[][] ar; ar = new Integer[3][]; for(int i = 0; i < ar.length; i++) { ar[i] = new Integer[3]; for(int j = 0; j < ar[i].length; j++) { ar[i][j] = new Integer(i*j); } http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ306.htm#Heading4731 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading8847 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/04.HTM
Dinaminiai sąrašai Java kalboje yra daug klasių, skirtų darbui su sąrašais, aibėmis ir kitomis panašaus pobūdžio struktūromis. Mes aptarsime tik List tipo objektus. interface List class LinkedList class ArrayList http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading10807 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12008 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12375
List vs Array Sąrašų skirtumai nuo masyvų: sąrašams nereikia iš anksto išskirti vietos; jų narių kiekis gali nuolat kisti; sąrašai gali būti sudaryti tik iš objektų (t.y. negali būti sudaryti iš primityvių tipų, tokių kaip int, double, boolean ir kt.) http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading10807 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12008 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12375
List tipo objektų sukūrimas List eile = new LinkedList(); List saugykla = new ArrayList(); Galima rašyti ir kitu būdu, tačiau pirmasis būdas yra universalesnis: LinkedList eile = new LinkedList(); ArrayList saugykla = new ArrayList(); http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading10807 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12008 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12375
Pagrindiniai veiksmai (metodai) add() – įterpti elementą; contains() – patikrinti, ar sąraše yra elementas; get() – paimti elementą iš sąrašo; indexOf() – gauti elemento indeksą sąraše; remove() – pašalinti elementą; size() – sąrašo dydis; toArray() – surašyti elementus į masyvą. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading10807 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12008 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12375
Pavyzdys List names = new LinkedList(); String name = null; while ((name = Group.getNextName()) != null) { names.addLast(name); } if (names.contains(“Jonas”)) { System.out.println(“Suradom Joną!”); http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading10807 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12008 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ311.htm#Heading12375
Klasių paveldėjimas (1) Tai klasės sugebėjimas paveldėti tėvinės klasės kintamuosius ir metodus (subklasė / vaikas paveldi iš superklasės / tėvo). Java neturi daigialypio paveldėjimo. Tą netiesiogiai galima išspręsti per interfeisus. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Klasių paveldėjimas (2) Vaikas paveldi visus “matomus” (ne private) tėvo kintamuosius ir metodus. Tai vienos krypties paveldėjimas. final tipo klasės paveldėti negalima. Konstruktoriai nėra nei paveldimi, nei perdengiami. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Pavyzdys (1) class Plokste { protected double ilgis; // private negali būti! protected double plotis; Plokste() { this.ilgis = 0; this.plotis = 0; } Plokste(double a, double b) { this.ilgis = a; this.plotis = b; // ploto skaičiavimo metodas double plotas() { System.out.println(“Nežinomas algoritmas!”); return –1; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Pavyzdys (2) class Staciakampis extends Plokste { // konstruktorius Staciakampis(double a, double b) { super(a, b); // kreipinys į konstr. Plokste } // metodų perdengimo pavyzdys double plotas() { return ilgis * plotis; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Pavyzdys (3) class Trikampis extends Plokste { // konstruktorius Trikampis(double a, double b) { ilgis = a; plotis = b; } // metodų perdengimo pavyzdys double plotas() { return ilgis * plotis / 2; http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Pavyzdys (4) class Testas { public static void main(String args[]) { Plokste plo = new Plokste(2,3); Staciakampis sta = new Staciakampis(2,3); Trikampis tri = new Trikampis(2,3); Plokste plo2 = new Trikampis(2,3); // !!! System.out.println(plo.plotas()); System.out.println(sta.plotas()); System.out.println(tri.plotas()); System.out.println(plo2.plotas()); } http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Atributas super Naudojamas parodyti, jog vaikas kreipasi į tėvą. Naudojama: kreipiniui į tėvo klasės konstruktorių (jis turi būti pirmuoju vaiko konstruktoriaus sakiniu): super(parametrai); kreipiniui į tėvo klasės kintamąjį / metodą (kai sutampa vardai): super.kintamasis / super.metodas. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Pavyzdys class A { int x; } class B extends A{ class C extends B { // šioje klasėje galime pasiekti visų klasių kintamuosius x x = 5; // x iš C klasės this.x = 5; // x iš C klasės ((B) this).x = 5; // x iš B klasės super.x = 5; // x iš B klasės ((A) this).x = 5; // x iš A klasės super.super.x = 5; // klaida! http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ308.htm#Heading5555 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Metodų perdengimas (overriding) Tai polimorfizmo atvejis, kai tėvo ir vaiko klasė turi vienodus metodus. Būtinos sąlygos – sutampa ne tik metodų vardai, bet ir jų antraštės bei grąžinamų reikšmių tipai. Metodo pasirinkimą nusako tipas objekto, kuriam šis metodas kviečiamas. Nepersidengia: konstruktoriai, final tipo metodai, statiniai metodai. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ309.htm#Heading6720 http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/07.HTM
Situacijų (Exception) valdymas Exception – tai įvykis, nutraukiantis įprastą programos darbą. Tai gali būti klaida programoje arba speciali programuotojo numatyta situacija. Situacijų “pagavimui” ir apdorojimui Java kalboje naudojama: try-catch blokai, sakinys throw, žodelis throws, finally blokas. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
Pagrindinės situacijų klasės Object Trowable Exception Error ClassNotFoundException NotSuchMethodException IOException EOFException FileNotFoundException ... RunTimeException ArithmeticException ClassCastException NullPointerException ... StackOverflowError OutOfMemoryError UnknownError ... http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
Situacijų klasės Exception klasės situacijas programuotojas gali pats “sugauti” ir apdoroti. RunTimeException klasės situacijos įvyksta programos vykdymo metu. Programuotojas jas gali apdoroti, bet neprivalo. Error klasės situacijų programuotojas valdyti negali, kadangi tai dažniausiai susiję su JVM klaidomis. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
try-catch blokas Programos kodas, kuriame gali įvykti situacija, patalpinamas į bloką try, po kurio talpinami catch ir finally blokai. try { // veiksmai } catch (GaudomaSituacija ex) { // veiksmai jai įvykus } http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
Pavyzdys (1) /** Skaityti tekstinį failą po eilutę ir išvedinėti į ekraną. Failo vardas imamas iš komandinės eilutės.*/ import java.io.*; public class ExceptionDemo { public static void main(String args[]) throws IOException { // throws IOException reikalingas metodui close(), esančiame finally bloke // kitaip finally turi turėti try-catch bloką BufferedReader reader = null; try { if (args.lenght == 0) { throw (new Exception(“Įveskite failo vardą”); // programa įvykdys catch (Exception ex) ir baigs darbą } reader = new BufferedReader(new FileReader(args[0])); String line = null; // tęsinys kitoje skaidrėje http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
Pavyzdys (2) while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (FileNotFoundException ex) { System.out.println(“Duomenų failas ” + args[0] + “ nerastas.”); } catch (Exception ex) { System.err.println(ex.getMessage()); ex.printStackTrace(); } finally { if (reader != null) { reader.close(); } else { System.out.println(“Failas nebuvo atidarytas”); http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ303.htm#Heading1109 http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ312.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/10.HTM
Įvedimas / išvedimas Įvedimas / išvedimas (IO) Java kalboje organizuotas per strautus (stream). Standartiniai srautai operuoja su baitais. Dirbant su Unicode simboliais patogiau dirbti su simboliniais srautais (reader ir writer). Srautas Java kalboje atitinka klasę. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ313.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/13.HTM
Išvedimo klasių hierarchija OutputStream ByteArrayOutputStream FileOutputStream ObjectOutputStream PipedOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream Writer BufferedWriter CharArrayWriter StringWriter PrintWriter FilterWriter PipedWriter OutputStreamWriter FileWriter P.S. System.out yra aprašytas: public static final PrintStream out http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ313.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/13.HTM
Įvedimo klasių hierarchija InputStream ByteArrayInputStream FileIntputStream ObjectInputStream PipedInputStream FilterInputStream BufferedInputStream DataInputStream Reader BufferedReader LineNumberReader CharArrayReader StringReader FilterReader PipedReader InputStreamReader FileReader http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ313.htm http://www.ifko.ktu.lt/~ekaza/T120b111/Book2/13.HTM
Papildomos IO klasės File – klasė, leidžianti atsiriboti tolimesnėse IO klasėse nuo naudojamos platformos. Turi eilę metodų darbui su konkrečiu failu. RandomAccessFile – tiesioginio priėjimo prie failo klasė (gali skaityti ir rašyti iš to paties failo vienu metu). StreamTokenizer – simbolių srauto skaidymas į “žodžius”. http://www.ifko.ktu.lt/~ekaza/T120b111/3java/htmlbook/TIJ313.htm
Papildomam skaitymui: ArrayList ir LinkedList naudojimas: http://developer.java.sun.com/developer/JDCTechTips/2002/tt0910.html#1 Nulinio ilgio masyvų naudojimas: http://developer.java.sun.com/developer/JDCTechTips/2002/tt0910.html#2 Metodų perkrovimas: http://developer.java.sun.com/developer/JDCTechTips/2002/tt0806.html#tip2 Java IO: http://developer.java.sun.com/developer/JDCTechTips/2002/tt0305.html#tip2 Exceptions: http://developer.java.sun.com/developer/JDCTechTips/2002/tt0110.html#tip1