Java (gjuhë programimi)

Java (sqt. Xhàva) është gjuhë programuese e cila fillimisht u zhvillua nga James Gosling dhe inxhinierë të tjerë të kompanisë Sun Microsystems. Java, si komponentë thelbësore e Java platformës, u lëshua në publik më vitin 1995 . Java edhe pse shumicën e sintaksës së saj e ka të derivuar nga gjuhët programuese C dhe C++, ajo në krahasim me këto dy gjuhë përmban një model të objektit më të thjeshtë si dhe ka përkrahje më të vogël për punë të drejtë-për-drejtë me resurset sistemore (si p.sh. memorien). Programet e shkruara në Java, zakonisht përpilohen në bajtkod që ekzekutohet në makinën virtuale të Java-së (ang. Java Virtual Machine) e cila është e pavarur nga arkitektura kompjuterike.

Gosling këtë gjuhë programuese fillimisht e kishte quajtur Oak (sq. dushk), sipas një druri dushku që shihej nga dritarja e zyrës së tij. Mirëpo, emri u shndërrua më mbas në Java për faj të drejtës së autorit, sepse ekzistonte një gjuhë tjetër programuese e quajtur Oak që nga 1991-shi .

 Historia 
Java filloi me një projekt të quajtur "Oak" nga James Gosling. Qëllimet e Gosling-ut ishin të vinte në jetë në makinë virtuale dhe një gjuhë që të ishte familjare me stilin e C dhe C++. Implementimi i parë ishte në 1995. Ai premtoi "Një shkrim, Zbato kudo" (WORA - Write Once, Run Anywhere), duke furnizuar runtime pa shpeza për platoformat popullore. Në fakt është i sigurt dhe siguria e tij mund të përshtatet, duke lejuar që hyrja e rrjetës dhe e file-eve të kufizohet. Me daljen e "java 2", versionet u mundën me konfiguracione të shumëfishta të ndërtuara për platforma të ndryshme. Për shëmbull, J2EE ishte për programe për ndërrmarje dhe J2ME për programe për platforma të lëvizshme, si telefonat celular, etj. Në 2006, versionet e reja të "J2" u riemërtuan Java EE, dhe Java SE.

 Lëshimet 
Këto janë versionet e projektit Java që nga 1997:

 JDK 1.1.4 (Sparkler) 12 shtator, 1997
 JDK 1.1.5 (Pumpkin) 3 dhjetor, 1997
 JDK 1.1.6 (Abigail) 24 prill, 1998
 JDK 1.1.7 (Brutus) 28 shtator, 1998
 JDK 1.1.8 (Chelsea) 8 prill, 1999
 J2SE 1.2 (Playground) 4 dhjetor, 1998
 J2SE 1.2.1 (none) 30 mars, 1999
 J2SE 1.2.2 (Cricket) 8 qershor, 1999
 J2SE 1.3 (Kestrel) 8 maj, 2000
 J2SE 1.3.1 (Ladybird) 17 maj, 2001
 J2SE 1.4.0 (Merlin) 13 shkurt, 2002
 J2SE 1.4.1 (Hopper) 16 shtator, 2002
 J2SE 1.4.2 (Mantis) 26 qershor, 2003
 J2SE 5.0 (1.5.0) (Tiger) 29 shtator, 2004
 Java SE 6 (1.6.0) (Mustang) 11 dhjetor, 2006  
 Java SE 7 (1.7.0) (Dolphin) i parashikuar për 2008

 Filozofia 
 Qëllimet primare 
Gjatë procesit të krijimit, gjuha programuese Java duhej t'i përfshinte pesë qëllimet vijuese:
 Të jetë e "thjeshtë, e orientuar në objekte, dhe e afërme".
 Të jetë e "fuqishme dhe e sigurt".
 Të jetë "neutrale sa i përket arkitekturës si dhe portative".
 Të ketë "efektshmëri të lartë".
 Të jetë e "interpretuar, fijezuar dhe dinamike".

 Platforma Java 
Njëra nga karakteristikat e Java-së është portativiteti, ku kjo d.t.th që programet kompjuterike që janë të shkruara në Java duhet të funksionojnë në mënyrë të ngjashme në cilëndo nga pajisjet ose/edhe sistemet operative që janë të përkrahura. Programeri duhet të ketë mundësinë që ta shkruaj programin një herë, ta përpilon një herë, dhe ta ekzekutoj çdokund, ku kjo është në përputhshmëri me parullën "Write once, run anywhere" (sq. "Shkruaj një herë, ekzekuto kudo") të Sun për Java.

Ky qëllim është arritur duke e përpiluar Java kodin në Java bajtkod në vend të kodit të makinës. Bajtkodi përmban instruksione që janë të ngjashme me ato të kodit të makinës, mirëpo këto instruksione janë të parapara që të interpretohen vetëm nga makina virtuale e Java-së.

 Shembuj 
 Shembulli: Pershendetje, Botë! 
Programi i njohur Pershendetje, Botë! mund të shkruhet në Java në këtë mënyrë:

/**
 * Programi shfaq në terminal mesazhin "Pershendetje, Botë!" dhe më pas përfundon
 */
public class PershendetjeBote {
    public static void main( String[] args ) {
        System.out.println( "Pershendetje, Botë!" );
    }
}
Sipas konventësCode Conventions for the Java Programming Language > 2 - File Names |language=en, skedat burimore duhet të kenë po të njëjtin emër si atë të klasës që e përmbajnë, si dhe prapashtesën .java, p.sh. PershendetjeBote.java. Së pari kodi duhet përpiluar në bajtkod (ang. bytecode) nëpërmjet Java përpiluesit, ku ky proces rezulton në krijimin e skedës PershendetjeBote.class. Programi i shkruar mundet të ekzekutohet vetëm kur të krijohet skeda respektive. Skeda që rezulton nga puna e përpiluesit njihet me emrin klasë skedë dhe kjo automatikisht e fiton prapashtesën .class

Kodi burimor në Java mundet të përmbajë vetëm një klasë publike (nënkuptuar klasë me qasje të tipit public), mirëpo nuk ka ndonjë kufizim për përmbajtje të klasave që kanë qasje të nivelit më të ultë se sa ai publik (p.sh. private). Pra, një klasë (class) e cila është e deklaruar si private (private) mund të vendoset në çfarëdo .java skedë.

Në Java termi public nënkupton që metoda mund të thirret nga klasat tjera, ose që klasa mundet të shfrytëzohet nga klasat që janë jashtë hierarkisë ekzistuese të klasës respektive. Duhet marrë parasysh që hierarkia e klasës është e lidhur me emrin e skedarit në të cilin gjendet skeda .java.

Termi static nëse është i vendosur përpara deklarimit të metodës, nënkupton që ajo metodë është e lidhur vetëm me klasën në të cilën është deklaruar dhe jo me instancat e asaj klase. Vetëm metodat statike munden të thirren pa referencë ndaj ndonjë objekti, p.sh.:
/**
 * MetodaStatikeTest.java
 */
public class MetodaStatikeTest {
	public static void main( String[] args ) {
		/**
		 * Qasja në metodën statike bëhet drejtë për së drejti 
		 * pa pasur të nevojë që të ketë instancë të klasës 
		 * Llogaritesi.
		 */
		int rezultati = Llogaritesi.mbledh( 1, 2 );
		System.out.println( "1 + 2 = " + rezultati );
	}
}

class Llogaritesi {
	public static int mbledh( int numri_pare, int numri_dyte ) {
		return numri_pare + numri_dyte;
	}
}
Poashtu, metodat statike nuk mund t'i qasen asnjërës prej variablave të metodës që nuk janë të definuara si statike.

Termi void nënkupton që metoda main (si në shembullin: public static void main( String[] args ) ...) nuk kthen asnjë vlerë prapa.

Metoda "main" duhet të pranoj një matricë vargjesh, që janë objekte të tipit . Sipas konventës matricës respektive duhet t'i referohet me emrin args, mirëpo pasi që kjo konventë nuk është e fuqizuar në formë të kufizimit, matricës mundet t'i referohet edhe me emër tjetër.

Procesi i shtypjes (printimit) është i përfshirë në librarinë standarde të Java, ku klasa  e bën definimin e një fushe statike publike me emrin . Objekti out paraqet një instancë të klasës  dhe ky objekt posedon metoda të shumta që ofrojnë shtypjen në daljen standarde (ang. standard out). Ndër metodat më të njohura të objektit out është println( String ), i cili përveç shtypjes bën edhe bashkëngjitjen e kodit për kalim në rreshtin e ri.

 Shembulli i Avancuar: Tek ose Çift 
/**
 * TekCift.java
 */
import javax.swing.JOptionPane;

public class TekCift {
	/**
	 * "hyrja" është një numër i plotë që ofrohet nga shfrytëzuesi
	 */
	private int hyrja;

	/**
	 * Kjo është metoda konstruktuese, e cila thirret kur ka nevojë të krijohet 
	 * objekti i tipit TekCift.
	 */
	public TekCift() {}

	/**
	 * Kjo është metoda kryesore e cila thirret nga Java interpreteri
	 */
	public static void main( String[] args ) {
		/**
		 * Rreshti vijues e krijon një instancë (objekt) të klasës TekCift me emër "numri" dhe 
		 * e inicializon atë. Më pas, bëhet thirrja e metodës "merrNumrin()" e cila e shfaq
		 * dritaren që merr nga shfrytëzuesi numrin.
		 */
		TekCift numri = new TekCift();
		numri.merrNumrin();
	}

	public void merrNumrin() {
		/**
		 * Blloku i kodit "try" shfrytëzohet për t'u siguruar që çdo është duke shkuar mirë.
		 * Në rast të shfaqjes të ndonjë problemi, Java interpreteri menjëherë kalon në bllokun
		 * e kodit "catch".
		 */
		try {
			/**
 			 * Rreshti vijues shfaq një dritare (JOptionPane) e cila merr nga shfrytëzuesi një
			 * numër. Vlera numerike e dhënë nga shfrytëzuesi kthehet si objekt i tipit String 
 			 * nga metoda "showInputDialog()". Kjo vlerë automatikisht konvertohet në vlerë 
 			 * numerike të tipit Integer me anë të kodit "new Integer( ... )" dhe më pas vendoset
 			 * në variablën "hyrja". Përfundimisht thirret metoda "llogarit()" e cila shfaq në 
 			 * terminal mesazhin "Çift" ose "Tek" varësisht nga numri i dhënë.
 			 */
			hyrja = new Integer( JOptionPane.showInputDialog( "Ju lutem shtypni nje numer" ) );
			llogarit();
		}
		catch( NumberFormatException e ) {
			/**
 			 * Nëse programi ka arritur në bllokun e kodit "catch", atëherë kjo do të thotë që
 			 * shfrytëzuesi nuk ka dhënë vlerë numerike.
 			 */
			System.err.println( "Ju nuk keni dhënë një numër. Ju lutemi shtypni një numër" );
		}
	}

	/**
	 * Metoda "llogarit()" do ta shfaq mesazhin bën shfaqjen e mesazhit "Çift" ose "Tek"
	 * varësisht nga rezultati i llogaritjes.
	 */
	private void llogarit() {
		if( hyrja % 2 == 0 ) {
			System.out.println( "Çift" );
		}
		else {
			System.out.println( "Tek" );
		}
	}
}

 Rreshti që përmban deklarimin import e bën importimin e klasës  nga pakoja .

 Rastet Speciale 
 Apletet 
Java apletet (ang. applets) janë programe të integruara brenda aplikacioneve tjera, si p.sh. ueb-faqeve që shfaqen me anë të ueb shfletuesve. Kodi që shfrytëzohet për krijimin e një Java apleti mund të shihet në vijim:

/**
 * TungBote.java
 */
import javax.swing.JApplet;
import java.awt.Graphics;

public class TungBote extends JApplet {
	public void paint( Graphics g ) {
		g.drawString( "Tung, Botë!", 65, 95 );
	}
} 

Deklarimet import që gjenden në fillim të kodit, bëjnë përfshirjen e klasave që gjenden brenda pakove respektive. Kjo përfshirje e bën të mundshme që t'i referohemi klasave me emër të shkurtër (si p.sh. JApplet) në vend të emrit të gjatë (si p.sh. javax.swing.JApplet).

Klasa JApplet trashëgohet (extends) nga klasa TungBote, ku rrjedhimisht ajo konsiderohet si nënklasë e klasës JApplet. Klasa JApplet si një JComponent (Java Graphical Component) i ofron apleteve mundësinë për shfaqjen e një interfejsi grafik për shfrytëzues (ang. GUI), si dhe i ofron mundësinë për të reaguar ndaj veprimeve të shfrytëzuesit.

Në kodin e sipërm, klasa TungBote për nevoja të shfaqjes të apletit, e mbishkruan metodën  e cila është e trashëguar nga superklasa . Kësaj metode i dërgohet objekti Graphics i cili ofron mjedisin për shfaqjen e apletit. Më pas, metoda paint() nëpërmjet metodës  shfaq vargun Tung, Botë! i cili është i vendosur (65, 95) pikselë nga këndi i lartëm i anës së majtë të apletit.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- TungBote.html -->
<html>
  <head>
    <title>Apleta Tung, Botë!</title>
  </head>
  <body>
    <applet code="TungBote" width="200" height="200">
    </applet>
  </body>
</html>

Apleti integrohet në HTML duke e shfrytëzuar HTML elementin <applet>. Elementi applet i ka tre atribute të inicializuara:
 code="TungBote" ku në të është e caktuar vendndodhja e JApplet klasës (TungBote.class)
 width="200" dhe height="200" në të cilën janë të caktuara vlerat për gjerësi dhe gjatësi të apletit.

 Servletet 
Servletet paraqesin komponentë të Java EE që qëndrojnë në server dhe gjenerojnë përgjigje (zakonisht HTML faqe) në bazë të kërkesave të pranuara nga klientët (zakonisht HTTP kërkesa). Për t'u kuptuar më lehtë, servleta mund të paramendohet si një aplet (pa pjesën grafike) e cila qëndron në server. Në vijim gjendet shembulli i njohur Tung, Botë! i realizuar me anë të një servlete:

/**
 * TungBote.java
 */
import java.io.*;
import javax.servlet.*;

public class TungBote extends GenericServlet {
	public void service( ServletRequest request, ServletResponse response )
		throws ServletException, IOException {
		response.setContentType( "text/html" );
		final PrintWriter pw = response.getWriter();
		pw.println( "Tung, Botë!" );
		pw.close();
	}
}
Deklarimi import përfshin të gjitha klasat publike si dhe interfejsët nga pakot  dhe .

Klasa  trashëgohet nga klasa TungBote. Klasa GenericServlet i ofron serverit interfejsin për përcjelljen e kërkesave të klientit tek servleta.

Klasa TungBote e mbishkruan metodën  që është e definuar brenda interfejsit  dhe që shfrytëzohet për menagjimin e kërkesave të dërguara nga klienti. Kësaj metode i përcjellët një objekt i tipit  i cili përmban kërkesën e dërguar nga klienti. Përveç këtij argumenti, metoda service() gjithashtu pranon edhe një objekt të tipit  i cili shfrytëzohet për krijimin e përgjigjes që duhet kthyer klientit. Në rast se ndodh ndonjë problem që e bën të pamundshëm dërgimin e përgjigjes, metoda service() shkakton përjashtime (ang. exceptions) të tipeve  dhe .

Metoda  shfrytëzohet për caktimin e tipit të dhënave që do ti kthehen klientit si përgjigje. Vargu "text/html" i cili i është dhënë metodës setContentType() tregon që përgjigja që i kthehet klientit do të jetë tekstuale dhe e llojit HTML. Në anën tjetër, thirrja e metodës  rezulton në kthimin e një objekti të tipit  i cili shfrytëzohet për shkrimin e të dhënave që duhet t'i dërgohen klientit. Përfundimisht, metoda  e bën shkrimin e vargut Tung, Botë! në përgjigjen që i dërgohet klientit, dhe metoda  e bën asgjësimin e objektit pw të tipit PrintWriter, me ç'rast përgjigja i dërgohet klientit.

 JavaServer Faqet 
JavaServer Faqet (ang. JavaServer Page apo shkurtimisht JSP) paraqesin komponentë të Java EE që qëndrojnë në server. Ngjashëm me servletet, JavaServer faqet bëjnë gjenerimin e HTML faqeve varësisht nga HTTP kërkesa e klientëve. Një ndër përparësitë e JavaServer faqeve është mundësia për integrimin e tyre brenda HTML faqeve, duke shfrytëzuar operatorët <% dhe %>. Shembulli Tung, Botë! realizohet me anë tv JavaServer faqeve në këtë mënyrë:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Shembulli "Tung, Botë!" me JavaServer Faqe</title>
    </head>
    <body>
        <h1><% out.println( "Tung, Botë!" ); %></h1>
    </body>
</html>

 Sving Aplikacionet 
Sving (ang. Swing) paraqet librarinë  të Java SE platformës, që shfrytëzohet për interfejsin grafik për shfrytëzues. Kjo librari është ndërtuar për shkaqe të ofrimit të një niveli të ri të ndërlikimit të GUI komponentëve, pasi që këto mungonin në librarinë Abstract Window Toolkit. Sving ofron një pamje dhe ndjenjë e cila është tipike për platforma të ndryshme. Pra, në shembullin e Microsoft Windows platformës, një Java aplikacion që shfrytëzon Sving librarinë nuk do të dalloj në pamje dhe ndjenjë nga aplikacionet tjera . Mirëpo, shfrytëzimi i Sving librarisë gjithashtu e bën të mundshëm që Java aplikacioni ta ketë një pamje dhe ndjenjë të pavarur nga platforma në të cilën funksionon.

Shembulli "Tung, Botë!" në një Sving aplikacion realizohet në këtë mënyrë:
/**
 * TungBote.java
 */
import javax.swing.*;

public class TungBote {
	public static void main( String[] args ) {
		JFrame frame = new JFrame();
		JLabel label = new JLabel( "Tung, Botë!" );
		frame.getContentPane().add( label );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.pack();
		frame.setVisible( true );
	}
}
Pra, katër hapat për krijimin e një GUI aplikacioni me anë të Sving librarisë janë:
 Krijimi i dritares: JFrame frame = new JFrame();
 Krijimi i komponentës grafike: JLabel label = new JLabel( "Tung, Botë!" );
 Shtimi i komponentës në dritare: frame.getContentPane().add( label );
 Shfaqja: frame.pack(); frame.setVisible( true );
Ndërsa, rreshti frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); shfrytëzohet që me mbylljen e dritares, instanca e JFrame të asgjësohet (në vend se vetëm të fshehët) ku kjo i mundëson JVM të përfundoj së bashku me Java aplikacionin respektiv.

 Edicionet 

Sun ka definuar dhe përkrah katër edicione të gjuhës programuese Java. Secili nga këto edicione shënjestron ambiente të ndryshme për aplikacione. Përsipër kësaj, Sun ka segmentuar shumicën e API-ve të tyre, në mënyrë që ato t'i përkasin vetëm një platforme. Këto platforma janë:
 Java Card për smart kartela,
 Java Platform, Micro Edition (Java ME) e cila shënjestron ambiente me resurse të kufizuara,
 Java Platform, Standard Edition (Java SE) e cila shënjestron ambiente të kompjuterëve të punës dhe 
 Java Platform, Enterprise Edition (Java EE) e cila shënjestron ambiente të serverëve

 Referime 

 Lidhjet e jashtme 
 Faqja Zyrtare e Gjuhës Programuese Java
 Udhëzues i Plotë për Gjuhën Programuese Java
 Java Aplete
 Konventat e Kodimit në Gjuhën Programuese Java

Kategoria:Java (gjuhë programimi)
Kategoria:Gjuhë programimi