Java (programlingvo)

**Java** (esperantigite *Javo* aŭ *Ĝavo*, dumprojekta nomo Green Project) estas programlingvo kreita de Sun Microsystems 23-an de majo 1995 sendependa de la operaciumo, kio signifas, ke ĝi funkcias sur virtuala maŝino, kaj nur ĉi tiu estas dependa de la operaciumo. Do, se oni uzas nur funkciojn de java, oni povos *unufoje skribi, ĉie ajn funkciigi* ĝin.

Java komenciĝis kun la celo fari TTT-paĝojn pli interaktivaj: anstataŭ la kutima parado de tekstoj, bildoj, sonoj kaj filmo (k.e. fiksita informo), Java ebligas al vi aldoni apletojn (angle: *applets*) aŭ komputilan inteligentecon al TTT-paĝo (per la HTML-marko **&lt;APPLET&gt;**). Ĉi-tage oni povas programi riĉan uzinterfacon en Java-apleto rulanta sur la propra komputilo, kaj tamen respekti la privatan sekurecon.

Kiel C++, Java estas objektema ido de C. Sed malsimile al C++, ĝi estas tradukata en **duonkodon** (angle: *bytecode*), kiu poste estas **interpretata de Virtuala Maŝino**, ekzemple en TTT-legilo kiu regas Java-n. La duonkodo estas sendependa de iu maŝino aŭ operaciumo: anstataŭe, la virtuala maŝino devas interpreti la kodon por sia sistemo. Tia maŝino estas konata kiel la Java Virtuala Maŝino.

Java-programoj ruliĝas ne nur en TTT-legiloj (kiel apletoj), sed ankaŭ kiel sendependaj programoj (kiel *apliko*). Cetere oni uzas Java-n en serviloj (ekzemple per JSP kaj servletoj) kaj ankaŭ por faboj. (Vidu "Specoj de Programoj" ĉisube). La apletoj estas nur la plej rimarkebla uzo de Java per simplaj uzantoj.

En 2000, Microsoft enkondukis novan lingvon, C#, por rivali Java-n. Ĝi estas ido de C++, kiu penas kuraci la difektaĵojn de Java.

Plejparte, se vi jam regas C++, **por lerni Java-n** vi devas
lerni **la klasaron** de Java, kiu estas pli plena ol tiu de C++. Por verki en Java idiotisme kaj trafe, vi devas lerni el la ekzemploj de efektivaj programoj, kiel kun iu ajn lingvo maŝina aŭ homa. Multe da fontkodo ekzistas enrete.

## La ĉefaj diferencoj al C++ 
[eta|dekstra|200px|Libroj pri [Java (programlingvo)|Java programado laŭ subklaso QA de la Klasifiko de la Kongresa Biblioteko.]]
* Por malebligi virusojn, Java **malebligas la skribadon al dosiero** (nur por apletoj) kaj uzon de **absoluta adreso de memoro**. Tiu malsamo, kvankam kapdolorigema, estas tute necesa por ia ajn surreta programado.
* Java havas **ampleksan klasaron** kiel bazon de la lingvo.
* Kiel Lispo kaj Smalltalk, Java enhavas **senrubigilon**, do vi ne devas liberigi la memoron de viaj objektoj.
* Java ne subtenas multoblan heredadon -- klaso heredas sole de unu patra klaso, tamen povas realigi plurajn interfacojn.

## La ĉefaj problemoj de la uzo de Java por apletoj 
Ĉar lernolibroj traktas pri Java ideala, ne reala, ili kutime diskutas pri la supraj diferencoj (kiuj sekvas de la difino de la lingvo), sed ne pri la nur praktikaj problemoj:

* En teorio, Java estas la sama sur ĉiu operaciumo, sed en nuna praktiko, la **malsamo de la grafika interfaco** estas sufiĉe grava. Via apleto povas belaspekti sur Vindozo sed esti maluzebla sur Unikso aŭ Makintoŝo! La nova klasaro Swing parte solvis la problemon.
* Malsamo de TTT-legiloj: Java estas ankoraŭ nematura, tial la nunaj **interpretiloj estas ankoraŭ malnetaj** kaj interpretas Java-n ne tute same. Pro tio, projekto de unu semajno povas daŭri unu *monaton* por funkciigi vian programon sub ĉiu legilo kaj eĉ *versio* de legilo. Microsoft, malamikema al Java kiel ebla rivalanta platformo, misinterpretas aŭ aliinterpretas Java-n.

Post tempo, la graveco de tiuj problemoj malaperos ĉar interpretiloj pliboniĝos.

Se vi sole regas je LISP, C, Pascal, ktp, vi devos lerni pri objektema programado:
aĉetu lernolibron (de Java, de C++ aŭ de objektema programado mem) kun bona enkonduko pri ĝi.

## Specoj de programoj 
En Java estas kvar ĉefaj specoj de programoj:

* apleto: (angle, *applet*) kutime apartenas al TTT-paĝo kaj estas rulita de la TTT-legilo.
* servleto: (angle, *servlet*) kutime apartenas al TTT-ejo kaj estas rulita de la servilo (la komputilo kiu servas la paĝojn de TTT-ejo). Servletoj ne havas grafikan interfacon. Servletoj estas la respondo de Java al CGI. CGI kutime estas realigata per la lingvo Perl, kies kodon estas malfacile legi kaj ripari. Servletoj kreas TTT-paĝojn kaj kuketojn (angle, *cookies*). JSP estas realigita per servletoj.
* apliko: (angle, *application*) sendepende de TTT-paĝo aŭ eĉ de la Interreto. Rulita de iu ajn komputilo (kiu enhavas Virtualan Maŝinon).
* fabo: (angle, *bean*) programero, kiu provizas specifan funkcion, kiun vi povas aldoni al via programo (apleto, servilo, apliko aŭ eĉ alia fabo) per bildprogramado (angle, *visual programming*). Per bildprogramilo, vi povas vidi la propraĵojn, eventojn, metodojn de la fabo kaj ĝian interrilaton kun aliaj faboj, kaj ŝanĝi ĉi tiujn de la fabo. (Sed vi ankaŭ simple povas skribi la fonttekston mane).  Unu speco de fabo, kiu estas rulita de servilo kaj ne estas videbla, estas la **EJB**: angla mallongigo por *Enterprise JavaBean*, ĝava fabo por entrepreno (t.e., retkomerco).

## Ekzemploj 
Jen tradicia Saluton, mondo! programo en Java:

```java
class SalutonMondo {
   public static void main(String[] args) {
      System.out.println("Saluton, mondo!"); // Montru la tekston.
   }
}
```

## Versioj 
La ĉefaj diferencoj inter versioj (Java programadaj kestoj por Java SE - Norma Eldono):

* **JDK 1.0** (majo 1995; 212 klasoj): la baza lingvo
* **JDK 1.1** (decembro 1996; 504 klasoj):
** nova modelo por eventoj
** internaj klasoj: klasoj difinitaj interne de alia klaso
** faboj: stilo de kodado, kiu ebligas programadon per videblaj unuoj de kodo
** RMI: ebligas vokadon de kodon sur aliaj maŝinoj tra la reto
** JDBC: ebligas demandi al datumbazo per SQL.
** subskriboj enĉifritaj
* **JDK 1.2** (decembro 1998; 1520 klasoj) -- alinomata **Java 2 SE** aŭ **J2SE**
** Swing: nova, pli racia klasaro por la grafika interfaco, sendependa de la altnivelaj grafikaj elementoj de operaciumoj
** grafika trenado kaj faligado
** Collections (kolektoj): nova, pli racia klasaro por aroj -- listoj, mapoj, aroj, ktp
* **JDK 1.3** (majo 2000; 1842 klasoj)
* **JDK 1.4** (decembro 2001; 2991 klasoj)
* **JDK 1.5** (septembro 2004; 3562 klasoj) -- alinomata **J2SE 5.0**
** Generaj tipoj: oni povas traduktempe (ne rultempe) aldoni tip- aŭ klasparametrojn, per kiuj precipe la kolektoklasoj iĝas tipsekuraj.
** Novaj konstruoj ebligas mallongigi la for-ordonon por iteracieblaj objektoj.
** enum ebligas efike deklari valordomajnojn kaj per nomo, kaj per numera valoro.
** Konkureco (Konkurenco pri komputadaj resursoj), paralelismo kaj sinkronigo iĝas pli kaj pli praktikaj kaj oni retrovas efektivajn uzojn.
* **JDK 1.6** (decembro 2006) -- alinomata **Java SE 6**
** Prinotaj klasoj nun povas aperi antaŭ klas-, kamp- aŭ metoddeklaroj. Oni mem deklaras la vivon de la prinotoj: dum traduktempo aŭ eĉ dum rultempo. Plena subteno de kompilado ene de java mem. Subteno por skriptlingvoj (jam kun Javaskripto). Java definitive malfermas siajn fontojn al la komunumo.

La revizioj 1.3 kaj 1.4 de Java estas veraj revizioj, revizioj de Java 2, kaj ne grandaj ŝanĝoj al la lingvo.

Por ruli Java-programojn oni nur bezonas la JRE (Java Rultempa Medio) de la **Java SE** - kiu ankaŭ estas subdosierujo de la JDK.
Por ruli retservilajn programojn ekzistas ekstra tavolo, la **Java EE** (Java Entreprena Eldono).
Por ruli sur limigitaj aparatoj kiel poŝtelefono, la **Java ME** (Java Mikro-Eldono) ekzistas.
Krom la klasaro de Java mem ekzistas multaj aliaj klasaroj, kiujn oni povas uzi.
Ekzemple por uzi objektan datumbazon pli facile, uzu S.O.D.A..

## Vidu ankaŭ 
* C++
* Objektema Paskalo
* C#
* GCC

## Referencoj 
## Literaturo 
* 

## Eksteraj ligiloj 
* Hejmpaĝo de Java ĉe Oracle ()
* Lernilo pri Java ()