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 
thumb|100px|right|Duke (shqiptuar Djuk) është maskota e gjuhës programuese Java
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 http://www.sun.com/aboutsun/media/presskits/2006-1211/ 
* 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ë:

```java
/**
 * 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ës, 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.:

```java
/**
 * 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. 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ë:

```java
/**
 * 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