JDK (Java Development
Kit)
El JDK és l'entorn base mínim per a crear programes en
Java. Conté:
-
Les llibreries de classes estàndard (compilades i font): java.lang,
java.util, java.io, java.net, java.awt, java.applet.
-
El compilador (javac) que produeix el p-code.
-
Un intèrpret d'applets (appletviewer).
-
Un depurador mínim.
-
Un intérpret (java), que permet executar aplicacions (no applets).
-
Un generador de documentació (javadoc).
-
Generadors d'interfície amb C (javap, javah).
-
Un cert número d'exemples instructius d'applets amb les fonts.
javac compila els programes font fets en java. Les fonts
han d'estar grabades en fitxers amb l'extensió .java. javac analitza
aquest fitxer .java i produeix tants fitxers .class com classes hi hagin
al fitxer .java.
java pren com a paràmetre el nom d'una classe. Llavors
busca un .class corresponent a aquest nom, carrega la classe corresponent
i crida al mètode main d'aquesta classe.
Per exemple java edicRemota www. fisystem. fr 23 78.8
El primer que farà serà buscar el fitxer edicRemota.class
als directoris definits a la variable d'entorn CLASSPATH, carrega la classe
corresponent i executa el m+etode main d'aquesta classe passant-li els
arguments www. Fisysem. fr , 23 i 78.8. Els arguments són considerats
cadenes de caràcters.
Així doncs, el jdk de Java és l'entorn mínim necessari
per crear i executar programes java. Existeixen però, altres plataformes
de desenvolupament de programes. Són per exemple el Sunsoft Java
Workshop, Symantec Café, Borland debugger for Java, etc.
Un exemple senzill.
L'exemple consisteix a mostrar una frase per pantalla. El codi font
és el següent:
import java.io.*;
public class EjemploSimple
{
public static void main (String args[ ])
{
System.out.println ("Hola, avui fà bon dia");
}
} |
El programa font s'ha de guardar al fitxer amb nom EjemploSimple.java.
La compilació s'inicia amb la comanda javac EjemploSimple.java,
que crea fitxers semicompilats (no executables), un per cada classe definida
al fitxer font. Aquests nous fitxers portaràn el mateix nom que
la classe definida al fitxer font amb l'extensió .class.
En el nostre cas es crea el fitxer EjemploSimple.class.
La execució del programa s'inicia mitjançant la comanda
java
EjemploSimple. El que estem fent és cridar al nucli java (incorporat
amb el jdk), indicant-li quina és la classe mestra de l'aplicació
(en el nostre cas EjemploSimple). Així doncs, una vegada s'inicia
l'execució del nucli aquest carrega la classe mestra que trobarà
al fitxer EjemploSimple.class, i executa el mèetode main
d'aquesta classe.
EjemploSimple.class és una llibrería dinàmica.
No conté còdi executable com les llibreries dinàmiques
clàssiques, sino codi java, interpretat pel nucli.
Recorda que has de tenir la variable d'entorn PATH apuntant al directori
adient per a que trobi els fitxers javac i java. Normalment c:\jdk\bin
-
Com a C, tot el que segueix a // serà ignorat pel compilador.
-
import java.io.*; Aquesta línia indica que el programa utilitzarà
la llibreria estàndard d'E/S de Java. Tot programa utilitza llibreries
precompilades. En aquest cas utilitzarà totes les classes del paquet
java.io, ja que s'ha indicat *.
-
public class EjemploSimple. Aquesta linia indica que s'esta definint una
classe anomenada ejemploSimple. Dins la classe es descriuen les característiques
d'aquesta (mètodes i atributs). En aquest exemple només tenim
una classe, que es confon amb el programa. La classe no té dades,
només un mètode, el mètode main, que és el
que el nucli java executarà quan carreguem el programa.
exercici:
Segueix les instruccions de l'exemple anterior per crear i executar el
programa EjemploSimple.
Java és orientat
a objectes
Dins la programació orientada a objectes, són sobradament
coneguts els concpetes:
-
classes: mètodes i atributs.
-
Encapsulació.
-
Herència.
-
Polimorfisme.
Una classe és una descripció estàtica d'un conjunt
d'objectes. I un objecte es pot instanciar a partir de la descripció
d'una classe: un objecte és dinàmic, es poden tenir una infinitat
d'objectes descrits per una mateixa classe. L'objecte és un conjunt
de dades presents a memòria.
D'aquesta manera, una classe finestra, podría instanciar-se tantes
vegades com es volgués. Però tots els objectes creats tindríen
la mateixa descripció (atributs) i comportament(mètodes).
Podem crear objectes gràcies a la paraula new, que reserva
l'espai de memòria suficient per a l'objecte. El que fà és
cridar al mètode constructor de la classe, que per definició
té el mateix nom que la classe. Es poden definir diferents constructors,
diferenciats pels paràmetres que els passem en el moment de cridar-los.
Si el programador no defineix un mètode constructor, java en defineix
un de predeterminat.
La descripció de la classe finestra:
class finestra
{
String titol;
int coordenadax;
int coordenaday;
int altura;
int amplada;
} |
Amb aquestes dues instanciacions:
finestra fin1=new finestra("finestra1",10,10,20,20);
finestra fin2=new finestra("finestra2",10,10,30,30); |
Provocaria la creació a memòria dels objectes:
Un mètode és una funció que s'executa sobre
un objecte. No es pot executar un mètode sense precissar l'objecte
sobre el qual s'aplica. Per exemple si volem duplicar el tamany d'una finestra:
Void DuplicarTam( )
{
altura=altura*2;
amplada=amplada*2;
} |
Si des de qualsevol altre part del codi volem duplicar el tamany de la
finestra fin1:
La encapsulació es basa en la idea de que certs atribbuts
i mètodes d'una classe no tenen per què ser coneguts per
la resta de classes. Així doncs podem declarar privats alguns atributs
i mètodes, que només podràn ser accesibles des de
mètodes de la mateixa classe.
Fixem-nos en l'exemple:
class finestra
{
public int x1, y1;
public int h, a;
} |
En aquest cas la classe finestra ha declarat els seus atributs públics,
per tant qualsevol altra classe que tingui un objecte de la classe finestra,
podrà modificar-los directament sense cap restricció.
class pantalla
{
finestra fin1;
void DuplicarTam( )
{
fin1.h=fin1.h*2;
fin1.a=fin1.a*2;
}
} |
Però que passaría si volguèssim canviar la definició
de la classe finestra afegint dos atributs més x2, y2, per a no
tenir que calcular-los cada vegada que volem dibuixar una finestra? Doncs
passaría que hauríem de redefinir finestra i redefinir pantalla,
perque pantalla utilitza els atributs h, a, que ja no existèixen
a finestra. Una solució a aquest problema sería:
class finestra
{
private int x1, y1,x2,y2;
void DuplicarTam( )
{
x2=x2+(x2-x1);
y2=y2+(y2-y1);
}
}
class pantalla
{
finestra fin1;
void metodeQualsevol( )
{
fin1.DuplicarTam( );
}
} |
Ara la classe pantalla no pot modificar directament els atributs de la
classe finestra però pot utilitzar el mètode DuplicarTam
de la classe finestra que li fà la feina. A més a més,
per qualsevol modificació de la classe finestra només cal
retorcar els mètodes de la classe finestra, no de qualsevol classe
que utilitzi un objecte de la classe finestra.
Java propordiona diferents nivells d'encapsulació:
-
private
-
private protected
-
protected
-
friendly
-
public
La herència és una de les nocions importants del diseny
i programació orientada a objectes. És una relació
entre classes definides per la paraula clau extends. Quan una classe filla
hereda d'una classe mare, significa que:
-
Recupera els atributs i mètodes.
-
Un objecte de la classe filla és també un objecte de la classe
mare (no recíprocament).
La classe que hereda, subclasse, pren els atributs i els mètodes
de la superclase, però pot:
-
Enriquir-los amb nous atributs i nous mètodes.
-
Redefinir els mètodes.
En aquest dibuix s'ha representat una classe mare al voltant de la cual
graviten d'altres classes amb diferents relacions amb ella. Recordem que
un paquet no és més que un grup de classes (amb o sense relació
lógica), agrupades entre si.
Anem a comprovar ara els pels diferents tipus de protecció, quins
privilegis d'accés tenen cada classe:
Protecció private: Cap altre classe pot accedir als atributs
o mètodes de la classe Mare.
Protecció private protected: La classe només permet
l'accés als seus atributs i mètodes a les seves subclasses,
estiguin o no al mateix paquet.
Protecció protected: Permet l'accés a les subclasses
i a les classes del mateix paquet.
Protecció friendly: Permet l'accés a totes les classes
del mateix paquet.
Protecció public: Permet l'accés a totes les classes.
Un exemple breu.
Anem a escriu-re una aplicació, que efectui un sondeig entre els
usuaris. Aquesta vegada utilitzarem el paquet gràfic de Java, amb
un conjunt de classes molt útils per a dibuixar objectes.
import java.awt.*;
public class Sondeig extends Frame
{
//atributs de la classe Sondeig
Button si;
Button no;
Label comentari;
Label mostrarResultat;
Contador elContador;
//mètodes de la classe Sondeig
public Sondeig ( )
{
elContador=new Contador( );
comentari=new Label("Troba interessant la xarxa Internet
??", Label.CENTER);
add("North", comentari);
si=new Button("Si");
add("East", si);
no=new Button("No");
add("West", no);
mostrarResultat=new Label("Sense respostes", Label.CENTER);
add("South", mostrarResultat);
}
public boolean handleEvent(Event evt)
{
if (evt.id == Event.WINDOW_DESTROY) System.exit(0);
else if (evt.target == si)
{
elContador.Si( );
mostrarResultat.setText(elContador.mostrarContador(
));
}
else if (evt.target ==
no)
{
elContador.No( );
mostrarResultat.setText(elContador.mostrarContador(
));
}
return super.handleEvent(evt);
}
public static void main(String args[])
{
Sondeig elSondeig =new Sondeig( );
elSondeig.setTitle("Sondeig");
elSondeig.pack( );
elSondeig.show( );
}
}
class Contador extends Object
{
//atributs
int numSi;
int numNo;
int total;
//mètodes
public Contador ( )
{
numSi=0;
numNo=0;
total=0;
}
void Si ( )
{
numSi++;
total++;
}
void No ( )
{
numNo++;
total++;
}
String mostrarContador ( )
{
StringBuffer cadena = new StringBuffer( );
cadena.append("si=" + numSi + " no=" + numNo + " "
+ (numSi*100/total) + "%");
return cadena.toString( );
}
} |
Exercici: prova d'executar l'exemple
anterior. Recorda que per a fer-ho has d'utilitzar java nomdelaclasseambmain
després de compilar totes les classes (javac nomfitxerambclasses.java).
Els applets de Java
Els applets són una de les particularitats de Java que contribueixen
al seu gran èxit. Permeten carregar a través de la xarxa
una aplicació portable que s'executarà al seu navegador (no
a la màquina servidora de pàgines web).
Diferències entre applet i aplicació:
-
Són carregats mitjançant el navegador, y no són executats
directament pel núcli Java.
-
Es carreguen a través de la xarxa per mitjà de les pagines
html, i no resideixen al disc dur de la màquina que els executa.
-
El seu cicle de vida és diferent. Una aplicació s'executa
una vegada, mentres que un applet s'inicialitza i arrenca, i es torna a
arrencar cada vegada que l'usuari recarrega la pàgina on es troba
l'applet.
-
Per raons de seguretat, tenen menys drets que una aplicació clàssica.
De manera predeterminada, a la màquina que els executa, no poden
llegir ni escriure fitxers, ni executar programes, ni carregar dll. Només
poden comunicar amb el servidor des d'on han surtit.
Els applets són cridats a partir d'una font html llegida a distància
pel seu navegador. El codi html que indica que ha de carregar-se un applet
és el següent:
<APPLET CODE="nom.class" WIDTH=200 HEIGHT=200
ALIGN=MIDDLE>
<PARAM NAME=elNom VALUE="Un exemple">
</APPLET> |
CODE: Dóna el nom de la classe que s'ha de carregar per a
arrencar l'applet.
WIDTH HEIGHT: Indiquen sobre quin espai es visualitzarà
l'applet.
ALIGN: Indica el tipus d'alineació.
PARAM NAME: Permet precisar tants paràmetres com es vulgui
a l'applet. Aquests paràmetres es recuperen al cos de l'applet amb
el mètode getParameter(String s).
Els applets no tenen mètode main. Quan el navegador arrenca un
applet, busca la classe amb el nom que s'indica a la font html. Aquesta
ha d'eheretar de la classe Applet. No es necessari definir un mètode
main(), pel contrari, el navegador cridarà automàticament
alguns dels mètodes de la classe Applet:
-
Constructor de la classe que hereda d'Applet, cridat en primera instància.
-
init(), cridat despres.
-
start(), cridat despres d'init(), i cridat cada vegada que l'applet ha
sigut aturat. Això succeeix quan es canvia de pàgina web
o es minimitza el navegador.
-
stop(), cridat just en els casos anteriors.
-
destroy(), cridat quan l'usuari abandona el navegador.
-
paint(), cridat cada vegada que s'ha de redibuixar el navegador.
Quan creem el nostre applet, hem de redefinir tot o part d'aquests mètodes.
paint(), especialment, proporciona el seu aspecte a l'applet. Aquest mètode
és cridat passant-li com a paràmetre un objecte Graphics.
Aquest és proporciona pel sistema, i el podem utilitzar sense preocupar-nos
del seu origen.
Si desitgem cridar a paint() des d'un altre mètode de l'applet,
podem fer-ho gràcies al mètode repaint(), que crida a paint()
proporcionant-li el paràmetre idoni.
Un exemple senzill.
L'exemple consisteix a redefinir els mètodes citats anteriorment
fent que per a cadascún d'ells afegeixi el seu nom en una taula
d'String, que així conservarà la memòria de les crides
efectuades.
import java.applet.*;
import java.awt.*;
import java.util.*;
public class cicle extends Applet
{
// la taula on s'enmagatzemaran els noms dels mètodes
cridats
Vector lesCrides = null;
public void paint(Graphics g)
{
int yactual=20;
g.drawString("Crides als mètodes:", 20, yactual);
yactual=yactual+15;
lesCrides.addElement("Paint");
for (Enumeration e=lesCrides.elements(); e.hasMoreElements();
)
{
g.drawString(e.nextElement().toString(), 20,
yactual);
yactual=yactual+15;
}
}
public cicle()//constructor
{
lesCrides = new Vector();
lesCrides.addElement("Constructor");
}
public void init()
{
lesCrides.addElement("Init");
}
public void start()
{
lesCrides.addElement("Start");
}
public void destroy()
{
lesCrides.addElement("Destroy");
}
public void stop()
{
lesCrides.addElement("Stop");
}
} |
La plana html que ens permet carregar l'applet, contindrà:
<APPLET CODE="cicle.class" WIDTH=400 HEIGHT=200
ALIGN=MIDDLE> </APPLET> |
Ara ja només cal cridar la pàgina, i
aquesta ens mostrarà l'applet en funcionament (previa compilació
de l'applet javac cicle.java)
Per a depurar un applet, podem utilitzar l'eina appletviewer que ens ofereix
jdk. Per a utilitzar-a utilitzarem:
Appletviewer cicle.html. (suposant que la plana html creada que conté
la crida a l'applet es diu cicle.html).
exercici: fixa't en l'exemple del joc
Mastermind, per a crear el teu propi joc. Pots
utilitzar les mateixes imatges i sons que s'han utilitzat en l'exemple.
Mastermind
En aquest joc les imatges es creen amb les funcions apropiades.
g.fillOval(x,y,r,r), g.setColor(c), g.drawOval(x,y,r,r), fixDisc(g,x+3,y+3,6,Color.white),
g.drawArc(x+4,y+4,9,9,-135,180)
public final class mastermind extends java.applet.Applet
{
public void init()
{
Creem les imatges (es pot optar per carregar els fitxers amb
les imatges ja creades)
}
public void clearBoard() // Reset all variables and prepare
for game
{
Reiniciem les variables i les figures amb repaint()
}
public boolean mouseDown(java.awt.Event evt, int x, int y)
{
A partir del events del mouse, realitzem les accions adequades
}
public void paint(Graphics g)
{
Dibuixem els elements del joc
}
}
Veure
solucions