Java (gjuhë programimi)

Nga Wikipedia, enciklopedia e lirë
Shko te: navigacion, kërko
Gjendeni te artikulli Java (gjuhë programimi). Për shprehjet e ngjashme në shkrim, kuptim apo tingëllim, shikoni këtu.
Java
Java logo.svg
Paradigma Orientuar në objekte, strukturuar, urdhëror
E projektuar nga Sun Microsystems
Doli më 1995
Emetimi i fundit Java Standard Edition 6 (1.6.0)
Tipi i disciplinës Static, strong, safe, nominative, manifest
Implementimi I shumtë
Ndikuar nga Objective-C, C++, Smalltalk, Eiffel, Ada 83, Mesa, Modula-3
Ndikoi në C#, D, J#, Ada 2005, ECMAScript, PHP, Scala
SO Ndër-platformik
Licenca GNU General Public License / Java Community Process
Website http://java.sun.com

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[1]. 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ërpilohenbajtkod 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[2].

Historia[redakto | redakto tekstin burimor]

Duke (shqiptuar Djuk) është maskota e gjuhës programuese Java[3]

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[redakto | redakto tekstin burimor]

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

Filozofia[redakto | redakto tekstin burimor]

Qëllimet primare[redakto | redakto tekstin burimor]

Gjatë procesit të krijimit, gjuha programuese Java duhej t'i përfshinte pesë qëllimet vijuese[4]:

  1. Të jetë e "thjeshtë, e orientuar në objekte, dhe e afërme".
  2. Të jetë e "fuqishme dhe e sigurt".
  3. Të jetë "neutrale sa i përket arkitekturës si dhe portative".
  4. Të ketë "efektshmëri të lartë".
  5. Të jetë e "interpretuar, fijezuar dhe dinamike".

Platforma Java[redakto | redakto tekstin burimor]

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[redakto | redakto tekstin burimor]

Shembulli: Tung, Botë![redakto | redakto tekstin burimor]

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

/**
 * Programi shfaq në terminal mesazhin "Tung, Botë!" dhe më pas përfundon
 */
public class TungBote {
    public static void main( String[] args ) {
        System.out.println( "Tung, Botë!" );
    }
}

Sipas konventës[5], 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. TungBote.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 TungBote.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 String. Sipas konventës[5] 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 System e bën definimin e një fushe statike publike me emrin out. Objekti out paraqet një instancë të klasës PrintStream 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[redakto | redakto tekstin burimor]

/**
 * 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" );
		}
	}
}

Rastet Speciale[redakto | redakto tekstin burimor]

Apletet[redakto | redakto tekstin burimor]

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 paintComponent(Graphics) e cila është e trashëguar nga superklasa Container. 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 drawString(String, int, int) 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[redakto | redakto tekstin burimor]

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 java.io dhe javax.servlet.

Klasa GenericServlet 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 service(ServletRequest, ServletResponse) që është e definuar brenda interfejsit Servlet 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 ServletRequest 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 ServletResponse 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 ServletException dhe IOException.

Metoda setContentType(String) 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 getWriter() rezulton në kthimin e një objekti të tipit PrintWriter i cili shfrytëzohet për shkrimin e të dhënave që duhet t'i dërgohen klientit. Përfundimisht, metoda println(String) e bën shkrimin e vargut Tung, Botë! në përgjigjen që i dërgohet klientit, dhe metoda close() e bën asgjësimin e objektit pw të tipit PrintWriter, me ç'rast përgjigja i dërgohet klientit.

JavaServer Faqet[redakto | redakto tekstin burimor]

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[redakto | redakto tekstin burimor]

Sving (ang. Swing) paraqet librarinë javax.swing 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[6]. 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[7].

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[8] me anë të Sving librarisë janë:

  1. Krijimi i dritares: JFrame frame = new JFrame();
  2. Krijimi i komponentës grafike: JLabel label = new JLabel( "Tung, Botë!" );
  3. Shtimi i komponentës në dritare: frame.getContentPane().add( label );
  4. 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[redakto | redakto tekstin burimor]

Java edicionet
Wave.svg
Java Card
Micro Edition (ME)
Standard Edition (SE)
Enterprise Edition (EE)

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

Referencat[redakto | redakto tekstin burimor]

[2]

Lidhjet e jashtme[redakto | redakto tekstin burimor]