Koncepte dhe Aplikime Baze ne JAVA
Më 23 Maj 1995, John Gage, drejtori i zyrës shkencore të Sun Microsystems bashkë me Marc Andreesen, bashkëkrijues dhe zëvendës president ekzekutiv i Netscape i deklaruan audiencës së SunWorld që teknologjia Java nuk ishte një mit por një realitet dhe se do të përfshihej në Netscape Navigator.
Qëllimi kryesor i krijuesve të Java-s ishte të krijonin një gjuhë që do të përfshinte pjesën më të madhe të funksionaliteteve të C++, gjuha më dominuese e asaj periudhe, por duke përjashtuar disa nga proçedurat e tejzgjatura. Përmirsimi revolucionar i hardware-it nga viti 1972 ne 1991 solli rritje eksponenciale të kërkesës për software më të mëdha dhe më komplekse. Gjuha C e zhvilluar në 1972 nga Dennis Ritchie, pas një dekade, u bë gjuha më popullore për programuesit, megjithatë struktura sintaksore e saj rezultoi e tejzgjatur. Në 1979, Bjarne Stroustrup zhvilloi gjuhën C++, një zgjerim i C-së që përfshinte filozofinë e re Object Oriented Programming.
Java është një gjuhë programimi e nivelit të lartë. Ajo ekzekutohet në platforma të ndryshme si Windows, Mac OS dhe versione të ndryshme të UNIX.
Që prej krijimit të saj Java ka pësuar shumë ndryshime. Fillimisht ishte e njohur si Java Development Kit ose JDK dhe e lidhur ngushtësisht me një platformë e cila përbëhej nga një set API (Application Programming Interfaces). Megjithëse shumë e ngadaltë dhe primitive në krahasim me standartet e ditëve të sotme, Java filloi një revolucion në zhvillimin e software-ve. Që prej versionit 1.2 në ’98, JDK dhe Java SE platform nuk janë sinonime të njëra tjetrës. Teknologjia Java mund të ndahet në komponentët e mëposhtëm:
Java është gjuha që përfshin sintaks mjaft strikte.
Java 2 Platform, Standard Edition (J2SE më vonë J2EE) i referohej platformës dhe ndër të tjera përfshinte klasat në paketat java.lang dhe java.io. Ka qenë blloku ndërtues mbi të cilin zhvilloheshin aplikimet Java.
Java Virtual Machine (JVM) është një software virtual machine që ekzekuton kodin Java të kompiluar. Meqënse kodi Java i kompiluar është përgjithësisht bytecode, JVM është përgjgjegjëse per kompilimin e këtij bytecode në kod makine përpara ekzekutimit. JVM merret zakonisht edhe me menaxhimin e memories në mënyrë që këtë mos ta bëjë kodi i aplikacionit.
Java Development Kit (JDK) ka qenë dhe mbetet pjesa software që zhvilluesit e Javës përdorin për krijimin e aplikacioneve. Ajo përmban një kompilator për gjuhën Java, një gjenerues dokumentacioni, dhe mjete për të punuar me kodin fillestar, zakonisht edhe Java source code në mënyrë që platforma të aktivizojë klasat për debugg.
Java Runtime Environment (JRE) ka qenë dhe mbetet pjesa software që përdoruesit përfundimtar shkarkojn për të ekzekutuar aplikimet Java të kompiluara. Përmban një JVM por asnjë nga mjetet e zhvillimit të JDK. JDK gjithsesi e përmban JRE
Disa koncepte dhe aplikime bazë në Java….
Objektet– Objektet kanë gjëndje dhe sjellje. Një objekt është instanca e një klase.
Klasa — Një klas mund të përkufizohet…si një template që përcakton gjendjet dhe sjelljet e një objekti…si një tip i të dhënave i vetëpërcaktuar, që mund të përdoret për të modeluar struktura të reja…si një grumbullim i metodave dhe variablave të tipeve të ndryshme.
Klasa objekt, në paketën java.lang, ndodhet në krye të pemës hierarkike. Çdo klasë është pasardhëse e kësaj klase. Çdo klasë e shkruar ose përdorur nga ju trashëgon instancat e metodave të klasës Object. Disa prej metodave më të përdorura janë equals(Object obj), hashCode(), toString() etj.
Metoda — Metoda mund të përkufizohet si sjellja e një objekti. Një klasë mund të përmbaj disa metoda. Në metoda shkruhet logjika, manipulohen të dhenat dhe ekzekutohen veprimet.
Një metodë konsiderohet edhe si “mesazh”, të cilin objekti ku thërritet kjo metodë ja dergon objektit që e deklaron këtë metodë.
Metodat rekursive — Rekursioni është një teknik programimi në të cilën një metod thërret vetveten. Kjo teknik mund të duket si një lup pambarim, gjë që mund të ndodh në disa raste, por ne mund të kontrollojm nëse ka një kondit e cila mund të ndërpres thërritjen e metodës. Rasti kur përfundojmë rekursionin quhet base case.
Shembulli i mëposhtëm është klasik në shpjegimin e rekursionit. Ai llogarit faktorialin e një numri n.
//iterativ import java.util.*; public class faktoriali { public static void main (String [] args){ System.out.println("Shkruani numrin per te cilin deshironi te llogaritet faktoriali: "); Scanner input = new Scanner(System.in); int f = input.nextInt(); int faktoriali = 1; while (f>1){ faktoriali= faktoriali * f; f=f -1; } System.out.println(" Faktoriali eshte " + faktorial); } }
//rekursiv import java.util.Scanner; public class FaktorialRekrusiv { public static int faktorial(int nr){ //base case if (nr == 0) return 1; return nr *faktorial(nr-1); } public static void main (String [] args){ System.out.println("Per cilin numer deshironi te llogarisni faktorialin?"); Scanner input = new Scanner(System.in); int nr = input.nextInt(); System.out.println(faktorial(nr)); } }
Konstruktori — Konstruktori është një metodë e veçantë e klasës e cila nuk ka tip kthimi pasi tipi që ajo kthen është i përcaktuar që është objekt i tipit të klasës në të cilën është konstruktori. Ai thërritet duke përdorur fjalën new DHE KA GJITHMONË EMRIN E KLASËS. Nëse nuk përcaktojmë një konstruktor kompilatori ndërton një konstruktor bosh për klasën.
Variablat — Më poshtë variablat janë shpjeguar sipas kategorive
Variabla të instancës (jo-statike) — Çdo instanc e një klase (çdo objekt) ka setin e vet unik të variablave. Gjëndja e një objekti krijohet nga vlerat që i vendosen instancës së variablave.
Variablat e klasës (statike) — Çdo fush e deklaruar me fjalën kyçe static është variabël e klasës, që do të thotë se ekziston vetëm një kopje e kësaj variable pavarësisht sa instanca të klases ka. Për të treguar se vlera e një variable nuk do të ndryshoj asnjeherë shtohet fjala kyçe final.
Variabla Lokale — Ashtu si objektet ruajn gjendjen e tyre në fusha, metodat ruajn gjendjen e tyre temporale në variabla lokal. Nuk ka asnjë fjalë kyçe që të percaktoj këtë lloj variable. Përcaktimi bëhet nga vendi se ku variabla deklarohet, që është midis kllapave hapëse dhe mbyllëse të një metode. Kështu variablat lokal janë të aksesushme vetëm brenda metodës ku janë deklaruar dhe jo në pjesët e tjera të klasës.
Parametrat — shfaqen në përcaktimin e një metode si për shembull args në metodën public static void main(String [] args).
Java Modifiers — Ndahen ne dy kategori
Access Modifiers: default, public, protected, private
Non-access Modifiers: final, abstract, strictfp
Te dhënat primitive në Java mund të jenë të tipit: byte, short, int, long, float, double, char, String, Boolean. Por Java na jep mundësin që të konvertojmë numrat në String dhe String-et në numra. Nënklasa Number që përfshin të gjithë llojet primitiv të numrave ka metodën valueOf() që konverton një string në një objekt të tipit numër. Të gjitha klasat e Number kanë edhe metodën parseXXXX() që nuk kthen një objekt por vetë llojin primitiv. Ndërsa për të konvertuar një numër në String përdoret metoda toString().
Kur duam të kontrollojmë nëse një variabël (ose një objekt) është i një tipi të caktuar përdorim fjalën kyçe instanceof. Për shembull
if(child instanceof Parent) => true/false
if(s instanceof java.lang.String) => true/false
Shembulli i mëposhtëm afishon 21 kufizat e para të vargut fibonaçi duke kthyer vlerat integer në String.
public class fibonaci { public static void main(String[]args){ String vargu = Integer.toString(0); String hapsire= " "; int kufizaParaArdhse = 0; int kufiza = 1; int temp; for (int j = 0; j< 21; j++){ vargu = vargu + hapsire+ Integer.toString(kufiza); temp= kufiza; kufiza = kufiza + kufizaParaArdhse; kufizaParaArdhse= temp; } System.out.println(vargu); } }
Java Arrays — Vektorët janë objekte që ruajnë disa variabla të të njëjtit tip. Çdo variabël quhet element dhe çdo element aksesohet nëpërmjet index-it të tij numerik (numërimi fillon nga 0). Vektorët Multidimensional janë vektorë, komponentët e të cilëve janë vektorë. Deklarimi i tyre mund të bëhet si më poshtë:
String [][] student = {{Emer, Mbiemer, Dega},
{A, B, Matematik},
{C, D, Fizike}
};
Për të parë se si mund të plotesojmë me vlera dhe të aksesojmë vlerat e vektorve do të shohim shembullin më poshtë:
import java.util.Scanner; public class trekendshiPaskalit { public static void main (String [] args){ Scanner input = new Scanner(System.in); System.out.println("sa rreshta te trekendshit te paskalit duhet te printohen?"); int rreshta = input.nextInt(); int [][] vektori = new int [rreshta][]; /*krijimi i trekendeshit*/ for (int i= 0; i<vektori.length; i++){ vektori [i] = new int[i+1]; } /*plotesimi me vlera*/ vektori [0][0] = 1; for (int i = 1; i<vektori.length;i++){ vektori[i][0] = 1; for (int j =1;j<vektori[i].length -1;j++){ vektori [i][j] = vektori [i-1][j-1] + vektori [i-1][j]; } vektori [i][vektori[i].length-1] = 1; } /*printimi*/ for (int i = 0; i< vektori.length;i++){ for(int j= 0;j<vektori[i].length;j++){ System.out.print(vektori[i][j]); System.out.print(" "); } System.out.println(); } } }
Enums — Enums limitojnë një variabël që të marrë vlerë vetëm nga një grup i paracaktuar vlerash.
Operatoret — Operatorët e barazimit dhe relacional përcaktojn nëse një operand është më i madh se, më i vogel se, i njëjtë, ose jo i njëjtë me operandin tjeter.
= = i njëjtë me
! = jo i njëjtë me
> më i madh se
> = më i madh ose i barabartë me
< më i vogël se
<= më i vogël ose i barabartë me
Opertaorët Bitwise
Mund të përdoren me tipat long, int, short, char dhe byte. Në qoftë se a=50 dhe b=15
a= 0011 0010
b= 0000 1111
Operatori AND a&b= 0000 0010
Operatori OR a|b= 0011 1111
Operatori XOR a^b= 0011 1101
Komplementari ~a = 1100 1101
Operatorët logjik
A=true B=false
Operatori logjik AND (A&&B) => false
Operatori logjik OR (A||B) => true
Operatori logjik NOT (!A) => false
Operatorët e caktimit
+= B+=A e njejt si B=B+A
*= B*=A e njejt si B=B*A
/= B/=A e njejt si B=B/A
-= B-=A e njejt si B=B-A
&= B&=3 e njejt si B=B&3
^= B^=3 e njejt si B=B^3
|= B|=3 e njejt si B=B | 3
Një tjetër operator kondicional është ?: që mund të konsiderohet si shkurtim i if-then-else. Përdorimi i tij është si më poshtë:
int vlera1 = 1;
int vlera2 = 2;
int rezultati;
boolean kondita = true;
rezultati = kondita ? vlera1 : vlera2;
“Në qoftë se kondita është true, vlera e vlera1 do ti kaloj rezultatit, përndryshe vlera e vlera2 do ti kaloj rezultatit”
–Return, Exception, break and continue
Ndryshimi i rrjedhës së ekzekutimit mund të bëhet në tre mënyra
- Nëpermjet return, i cili ndalon ekzekutimin dhe kthen si vlerë vlerën e dhënë psh: return 5; kthen 5, return; kthen void pra asgjë.
- Ndryshimi i rrjedhës së egzekutimit ka kuptim të ndodh gjithashtu kur ndodh një situatë përjashtimore: Exception.
Kur një error ndodh brenda një metode, metoda krijon një objekt dhe ja kalon sistemit runtime. Objekti i quajtur exeption object përmban informacion në lidhje me error-in, përfshin llojin dhe gjendjen e programit në kohën kur ndodh error-i. Krijimi i një exeption object dhe kalimi i tij në runtime quhet hedhje e një exeption. Mund të hedhim një exception me anë të instruksionit throw new Exception();
public class Exceptions{ public static void main(String Args[]){ int[] array = new int[3]; try{ for(int i=0;i<4;++i){ array[i] = i; } } catch(ArrayIndexOutOfBoundsException e){ System.out.println(e.getMessage()); System.out.println("Oops, we went to far, better go back to 0!"); } finally{ for(int i=0;i<3;++i){ System.out.println(array[i]); } } } }
- Instruksionet break dhe continue.
Konstrukti switch. Për mos të përdorur if()else if() else përdorim:
switch(variable){
case “a”:instruksione; break;
default: instruksionexx;
}
Nëse nuk vendoset break pas një rasti egzekutohet edhe case i poshtëm.
Instruksionet në default egzekutohen nëse variabli nuk është i barabartë me asnjë vlerë nga ato që janë në case.