Sunteți pe pagina 1din 43

1

Tema 1. Introduccion a la plataforma Java


java Empieza en el ao 91 como un proyecto liderado por james gosling. SUN se dedicaba a las grandes maquinas unix y decide entrar en el negocio de los pequeos dispositivos y principalmente de la TV Dijital. El nuevo lenguaje debia ser:

Pequeo Independiente de la arquitectura

Cojen la idea de la maquina virtual de niclaus wirth y la sintaxis de C++ A ese lenguaje lo llamaron oak, pero ya estaba registrado asique lo cambiaron por java. (el nombre en codigo era proyecto green). Crearon una filial de sun para java llamada firstperson inc Hicieron dos proyectos: *7 y 'vod' pero ninguno de los dos triunfo. El proyecto estaba abocado al fracaso hasta que sin comerlo ni beberlo se incluye java en el navegador web mosaic para poder interpretar codigo... algo que java podia hacer de marabilla al ser independiente de la arquitectur, y eso lo relanzo.

Caracteristicas
Lenguaje Interpretado y multiplataforma. Simple: POO: Lo hicieron parecido a C++, que era loq ue usaba la gran mayoria de la gente y le quitaron las 'cosas raras' que tenia. Es un lenguaje orientado a objetos puro.

Distribuido: Gran soporte para aplicaciones dependientes de servicios de red Robusto: Detecta un gran numero de problemas en compilacion. Gestion automatica de la memoria Verificacion de tipos Seguro. Arquitectura Neutral: Portable: Es independiente de la arquitectura en la que corre gracias asu maquina virtual.

Ademas de independiente de la arquitectura, e sportable. No tiene aspectos dependientes de la implementacion por debajo. (en C++ por ejemplo, las variables no tienen tamaos fijos en todas las maquinas... en java si).

2 Interpretado: Alto rendimiento: Lo hace algo lento, aunque tratan de arreglarlo con el compilador JIT Para lograr que un lenguaje interpretado sea rapido, desarrollan el compilador Just in time o JIT. Interpreta y deja el codigo preparado en codigo nativo para futuras veces.

Multihilo Dinamico

Modelo de compilacion y ejecucion


Tenemos una maquina virtual que se va a ocupar de compilar y ejecutar el codigo, que va a ser universal.teniendo una maquina virtual para cada maquina.

HolaMundo.java

Compilador

HolaMundo.class

El holamundo.class es universal y se donomina: ' bytecodes ' Ese proceso lo hago una vez. El holamundo.class va a la maquina virtual y por debajo va el sistema operativo. La maquina virtual tiene que ocultar todo lo que pasa por debajo

Aplicaciones Clases MV Interfaz de portabilidad Adaptador Navegador SO Hardware Adaptador SO Hardware Hardware

Maquina Virtual (MV)


Adaptador Para trabajar con las cosas reales que tiene por debajo. Es lo que hay que reescribir para migrar el software de una plataforma a otra.

Sistemas en tiempo de ejecucion java


Plataforma Java enlazador de metodos nativos cargador de clases y verificador MV Area de metodos nativos Compilador JIT HEAP Codigo de soporte Motor de Ejecucion

SISTEMA OPERATIVO Motor de Ejecucion Puede ser hardware o software En as versiones iniciales el JIT no existia y lo hacia todo el ME. Cargador de clases y verificador El verificador comprueba, da por bueno o no el *.class de la entrada. Busca intentos de modificar punteros etc... Hace 4 pasadas. Ese verificador no actua por defecto en todas las clases, actua en las clases que el sistema de ejecucion de java le dice. Para no permitir alterar las clases (como medida de seguridad), tenemos el cargador de clases.

4 Heap El administrador de memoria o 'monticulo' tiene, por ejemplo, un recolector de basura automatico. (aunque tambien se le puede llamar manualmente) como lo hace? Contabiliza todas las referencias. Cuando no hay nadie con un apuntador al objeto lo borra. Marca esa zona de memoria como 'utilizable'. Marcar o intercambiar. Sobre un monticulo marco periodicamente los objetos que no tienen referencias hacia ellos y tengo uno en que tengo los que si tienen. Cod. Soporte Control de excepciones exigente.

Hilos Excepciones Seguridad

Soporte a codigo nativo Puedo utilizar codigo en otro lenguaje como C++ o DLL`s de windows.

Gestor de Seguridad
Todo lo que llega va a una zona perfectamente acotada llamada sandbox. No podra ni salir de esa zona ni tocar nada fuera de su alcanze. Posteriormente se aadio (en la version 1.1) la posibilidad de firmar los aplets. En 1.2 pasa primero a un gestor de seguridad que decida a que parcela envia cada cosa. Las 4 lineas de seguridad:

El codigo. No se puede hacer burradas con el (como en C++ ) Verificador muy bueno y verificador de bytecodes Cargador de clases Gestor de seguridad (no permite el acceso al sistema de ficheros, por ejemplo).

Distribuciones

J2SE Java 2 Standard Edition. Version estandar basica. (la que usaremos). J2EE Java 2 Enterprise Edition. Version para empresas. J2ME Java 2 Micro Edition. Version para dispositivos moviles.

Tema 2. El Lenguaje Java


Tipos de datos
Hay dos tipos, los primitivos y los referenciados. Primitivas Tipos de datos preestablecidos por el lenguaje como los de toda la vida. Referenciados Basados en clases Van a ser objetos Accederemos a ellos mediante descriptores / referencias Primitivos Son los que manejamos de siempre, int, float, etc... No tienen nada asociado ni interpretacion posible. Propios de lenguajes no orientados a objetos. Eficientes Char Un caracter UNICODE. (compatible con ASCII) Son 16 bits A efectos practicos es un entero de 16 bits. Byte Un numero entero de 1 byte

Short Un numero entero de 2 bytes

7 Int Un numero entero de 4 bytes Long Un numero entero de 8 bytes En Java no disponemos de los unsigned de C++ Float Numero real de 4 bytes. 1039 Precision de 6, 7 dijitos. Double Numero real de 8 bytes. 10317 Precision de 15 dijitos. Boolean Es verdadero (true) o falso (false) y no se transforma en un valor numerico, solo es eso, true / false. Void Valor Nulo No tenemos el tipo record, ni el struct ya que contando con las clases para que queremos un tipo de datos primitivo registro? Seran clases. Los identificadores son cadenas con numeros y letras, el simbolo subrayado ( _ ) y el deld olar con la condicion de que no comienze por numero ni tenga espacios dentro. Un identificador no puede ser una palabra reservada ni la spalabras true/false que estrictamente hablando no son palabras reservadas sino valores de una variable. Existe el convenio de llamar a la svariables con letras minusculas y a las clases que comienzen con mayuscula.

Inicializacion
Las variables primitivas se inicializan: Numericas: a 0 o a 0.0 Char: a 10 bool: a false Las variables de tipos referenciados se inicializan a null

Declaracion
[modificadores] Los modificadores van a ser:

[static][final] tipo nombre;

Public Private Protected

Y me van a decir quien puede hacer que con mis datos. Static: Sigue siendo el static de C++ (hace que un metood pertenezca a una clase, no a un objeto) final: Es equivalente al Const de C++

Visibilidad / Ambito
El concepto de bloque se marca por llaves { } y sigue siendo el mismo.

clase {

Bloque de la clase

Acceso numerico Bit a Bit


Existen unas clases para trabajar con numeros llamadas:

Biginteger Bigdeamer

Entre las funciones de esas clases destacamos: objeto.testbit( i ) Eso devuelve cierto si el bit del objeto que ocupa la posicion ' i ' es un 1 y falso si es otra cosa distinta,

Conversion de tipos
Primitivos Puede ser implicita (lo hace automaticamente el compilador sin que el usuario se de cuenta). Y explicita, en las que 'forzamos' la conversion. int a=3; float b=8.2, c; c = a+b Aqui se hace una conversion implicita de 3 a 3.0 y despues suma. Puedo hacer conversione simplicitas siempre que no pierda informacion, el compilador no puede nnca saber que informacion tiene que tirar o cual no.

10 Explicita (Cast) Conversiones que pedimos nosotros. long a=3; int b=8, c; c = a+b; Si lo hago asi me sale un mensajito con un aviso de la posible perdida de informacion. Para evitarlo y forzar la conversion hemos de hacer: c = (int)a + b c = (int) (a + b) Que obviamente no es lo mismo, pues dependiendo del valor de los decimales, si la cantidad perdida excede la unidad (la suma) estaremos alterando el resultado final. Ejemplo: float a=2.8, b=3.7; int c; c= (int)a + (int)b = 2 + 3 = 5 pero si: c = (int) (a + b) = (int) (6.5) = 6

[ (int)a + (int)b ] <> [ (int) (a + b) ]

11 Ejemplo: byte a=3, b=2, c; a = a*2; c = a+b; Eso daria un error de perdida de precision al ser a*2 un int y a un byte. Para evitar el desbordamiento, se lanza un mecanismo de seguridad que a cualquier entero por debajo de un byte lo convierte automaticamente en int. Referenciales (sus conversiones) Puedo hacer conversiones entre objetos de clases si estas estan relacionadas en herencia. Un apuntador a la clase padre puede pasar a apuntar a un objeto de una clase hijo. La conversion hacia arriba es automatica. Hacia abajo es explicita. (hacia arriba o hacia abajo hace relacion a la ascensio o descenso en la jerarquia de clases padres e hijas relacionadas entre si por herencia) Entre Primitivas y referenciales Directamente es imposible. Habria que ir atributo por atributo asignandole el valor que fuera. Clases envolventes Igual que existen los tipos int, float etc... tambien existen las clases int, float etc... una por cada tipo con estructura de clase y metodos para manejarlos. Existen metodos para la conversion de estas clases envolventes en otras clases envolventes e incluso en tipos distintos...

12

Operadores
Aritmeticos +, -, *, /, % (modulo) ++ incrementa y decrementa. n=a++ primero asigna y despues incrementa a. si fuera n=++a primero incrementaria y despues asignaria. Relacionales / Logicos <, >, <=, >=, ==, !=, = && es AND | | es OR ! es NOT A nivel de bit <<, >> op1 << op2 desplaza los bits de op1 hacia el sentido de las flechas el numero de posiciones que indique op2. & es AND a nivel de bit | es OR a nivel de bit ^ es la XOR ~ es el complemento Asignacion = es el igual b *= a b=b*a

Las asignaciones son las unicas que se lees de derecha a izquierda: int a=b=c=d=7

13 ? int a,b,c; c= a>b?a:b; si a>b c vale a sino c vale b. instanceof NombreObj instanceof NombreClase Devuelve true si NombreObj es de la clase NombreClase, sino devuelve falso.

Comentarios
/* Comentario Multilinea */ // //* */ Comentario que permite despues generar documentacion Comentario de una linea

14

Sentencias
Sentencias de control IF If (exp_logica) sentencia; [ELSE sentencia; ]

If (exp_logica){ sentencia 1; sentencia n; } [ELSE { sentencia 1; sentencia n; ]

Switch switch (ordinal) { case opcion1: ---------------------break; case opcion2: ---------------------break; case opcion n: ---------------------break; [default: ---------------------- ] }

15 Si no pongo el break, continuara con los siguientes casos hasta que encuentre un break. Esto lo podemos utilizar para asignar el mismo bloque de codigo a varias opciones: switch (ordinal) { case 1: case 2: case 3: ---------------------break; }

Bucles FOR for (inicializacion; expresion; incremento) { ------------------------------------------------------------------------------------------------}

La inicializacion, expresion e incremento pueden ser varias sentencias separadas por comas. Do While Do { ------------------------------------------------------------------------------------------------} while (expr_logica)

16 While While (expr_logica) { ------------------------------------------------------------------------------------------------}

Sentencias de ruptura Break Se usa en bucles y en switch. En bucles dice que salga del bucle y no entres en la siguiente iteracion. Para saltar, por ejemplo, desde dentro de un bucle anidado a una instruccion fuera de todos esos bucles anidados se usan las etiquetas para marcar codigo. Se marca el bloque con nombreetiqueta: justo antes del bloque y el break lo hacemos asi: 'break nombreetiqueta' bucle; for (i=0, j=0;i<100;i++) { while (true) { if ((++j)>5) break bucle; else break; } } Con la etiqueta marco el bloque que quiero 'saltar'. El break me lleva a la etiqueta que me dice que me salte ese bloque y paso directamente a la primera isntruccion justo despues de dicho bloque. Continue Se utiliza en bucles. Finaliza la iteracion que esta ejecutando en ese momento y continua con la siguiente iteracion.

17

Mi primer programa en java

public class holamundo { public static void main ( String args[ ] ) { system.out.println(\n Hola, Mundo! \n ); } }

HolaMundo.java javac HolaMundo.java HolaMundo.class Ejecucion java HolaMundo

El fichero *.java tiene que llamarse igual que la clase publica OBLIGATORIAMENTE. El String args [ ] es un array llamado args cuyos elementos son referencias a objetos de la clase String y en ese array va a guardar los parametros ue le pasemos al ejecutable en el momento de la ejecucion. Los arrays son objetos de la clase Array y uno de sus metodos es length

18

Arrays
Respecto al tratamiento de arrays en C++, son mas seguros pero menos eficientes. Son objetos y por tanto poseen sus propios metodos. La declaracion de un array no reserva espacio para sus elementos. Declaracion [ modificadores ] tipo nombre[ ]; [ modificadores ] tipo [ ]nombre; En caso de que sean arrays con elementos de tipo primitivo, en cada posicion guardo el elemento incrustado. Si es referenciado guardo una referencia al objeto (por medio de la cual puedo acceder a el, a sus atributos y a sus metodos). Declaracion con inicializacion Tipos Primitivos int lista[ ] = { 1, 2, 3, 4}; Ejemplo: Matriz de 3 dimensiones. Int [ ] [ ] [ ] l = { { { 1, 2, 3}, { 4, 5, 6}, {7,8,9} } ... l.length = 2 l [0].length = 3 l [0][0].length = 3

19 Tipos Referenciales public class Elemento { ------------------------------------------------------------} public class Matriz { public static void main (String [ ]args) { Elemento [ ]lista = {new Elemento(x), new Elemento(x), new Elemento(x)} } }

Declaracion sin inicializacion Primitivos int [ ]array = new int[ 3 ]; Array de 3 elementos sin inicializacion y reservando memoria para ellos. Referenciales Damos por declaradas las clases Elemento y Matriz del caso anterior. Elemento [ ]array = new Elemento [3]; No he llamado a ningun constructor luego no he reservado memoria para los objetos sino solo para las referencias a los mismos que es lo que va a haber en las posiciones del array: referencias. Ahora asigno: array [0] = new Elemento(x);

20 Caso: int [ ]a = {1,2,3} int [ ]b = new int [3] b=a Hay que entender que a y b no son los arrays en si mismos. Me explico, no son la sposiciones del array sino solo una referencia a donde comienzan... con eso entenderemos perfectamente como ahora, con a = b lo que hacemos es poder manejar los elementos de b con el array / referencia a y los datos de a quedan perdidos e inaccesibles... cuidado con eso ;)

Se pueden hacer matrices de distintas dimensiones, pero eso si, todas del mismo tipo, claro.

int [ ] [ ]m = new [3][ ]; m[0] = new int[2]; m[1] = new int[4]; m[2] = new int[8];

21 Ejemplo Programa

Dialogo: Saluda que soso eres Saluda hola Hola, que tal estas Saluda adios Pirate antipatico Saluda cualquier otra cosa mi no entender

Public class Saluda { public static void main ( String [ ]args) { args.length x.equals (hola) } } #compara la cadena x con hola

22

String
Orientado para el manejo de cadenas de caracteres. La clase String esta pensada para cadenas que no van a ser modificadas en tamao en toda su vida. No hay acceso a caracteres mediante corchetes [ ] Para utilizar cadenas que si podremos modificar y tratar mas usaremos la clase StringBuffer Como casi siempre en estos casos, la clase String es mas eficiente y la clase StringBuffer ofrece mas posibilidades. Inicializacion String S1 = Hola; // Version buena String S2 = new String(Hola); // Version Mala

System.out.println exige que se le pase un objeto de la clase String CharAt(int) devuelve el caracter en la posicion int S1.length devuelve la longitud de la cadena

StringBuffer
Permite modificar el contenido asi como la longitud de la cadena. Tiene todos los metodos de String Tiene un metodo append que sirve para aadir un elemento a la cadena. S1.ToUpperCase( ) convierte a mayusculas SetCharAt sirve para fijar caracteres.

for (i=0; i< i.length ; i++) system.out.println (S1.CharAt(i))

23

Entrada / Salida ( E/S )


Tenemos objetos encargados de esas cosas que van a ser: System.in : Toma datos de la entrada estandar System.out : Envia datos a la salida estandar. System.err : Utilizado para enviar mensajes de error a la salida por defecto para los mismos que es, por defecto, la pantalla. Se pueden redireccionar con: System.setin( ) System.setout( ) System.seterr( ) Como leemos? int read( ): Lee un caracter y lo devuelve como int.

System.in.read( ) Leer una cadena caracter a caracter

Char c; StringBuffer frase= new StringBuffer( ); c = (char) system.in.read( ); while (c= (char) system.in.read( )) != \n ) frase.append(c); // frase = frase + c;

24 Leer una cadena del tiron Readline( ) devuelve un string y es un metodo de la clase BufferReader BufferReader requiere un objeto reader en su constructor. ImputStreamReader es una clase derivada de reader (con lo que se la acepta en el constructor de un objeto de la clase bufferReader) y acepta imputStream como argumento de su constructor.

String frase = ; InputStreamReader ISR = new InputStreamReader(system.in); BufferReader BR = new BufferReader (ISR); try { frase = BR.readline( ); } catch ( java.io.ioexception e) { } //lanza una excepcion que // debo recojer

Tokens
Una cadena la podemos dividir en partes o tokens. Separados por lo que queramos, espacios, guiones etc... StringTokenizer es una clase con metodos para separar palabras, distinguirlas, etc... Metodos: boolean hasmoretokens( ) String nexttoken( ) int counttoken( ) Mostrar cada token en una linea system.out.println ( hay + S1.counttoken( ) + tokens) while (st.jasmoretokens( )) system.out.println (s1. Nexttoken( ));

25

Paso de informacion a un metodo (Argumentos)


Los argumentos se pasan por valor. No podemos modificar el valor pasado (claro, es una copia) un tipo referencial loq ue pasa es una copia de la referencia al objeto.

public class lapiz { private int r,v,a; public lapiz (int r, int v, int a){ r=this.r; v=this.v; a=this.a; } public void getrgb (int r, int v, int a) { r=this.r; v=this.v; a=this.a; } } public class ejemplo { public static void main (string [ ] args) { int rojo=1, verde=2, azul=1; lapiz lapiz = new lapiz (rojo, verde, azul); rojo=-1; verde=-1; azul=-1; lapiz.getrgb (rojo, verde, azul); system.out.println(rojo:+ rojo.... );

Y eso dara -1, -1, -1 ya que getrgb no ha modificado nada mas que una copia del original...

void f (int a) { a=18; } int i; i=12; f(i); i sigue valiendo 12... como lo cambio? Debo pasar esos atributos como un objeto aparte:

26 public class rgb { public int rojo=0, verde=0, azul=0; public rgb (int r, int v, int a) { rojo=r; azul=a; verde=v; } public void actualiza (int r, int v, int a){ rojo=r; verde = v; azul=a; } } public class lapiz { private int r,v,a; public lapiz (rgb color){ this.r=color.rojo; this.v=color.verde; this.a=color.azul; } public void getrgb(rgb color) { color.actualiza (r,v,a); } } public class ejemplo { public static void main (String [ ]args) { rgb color = new rgb (1,2,3); lapiz lapizero = new lapiz(color); color.actualiza (-1,-1,-1); // lapiz ahora tiene los colores -1, -1, -1 lapiz.getrgb(color); // los atributos de color son -1, -1, -1 }

Cuando haces el return al final de un metood, devuelves la referencia al objeto.

27

Tema 3. POO Usando java


El valor de cualquier variable objeto es una referencia al objeto almacenado en otra parte. Una referencia puede ser nula y puede ser reasignada

Herencia

La herencia permite definir nuevas clases basandose en clases existentes. Se usa la palabra reservada extends

clase heredera extends clase madre

No existe la herencia multiple, solo la simple.

Interface

Es un conjunto de declaraciones de funciones. Si una clase implementa una interfaz, tiene todas las funciones especificadas por el interfaz. Una clase puede implementar varias interfaces (simulacro de herencia multiple)

Paquete

Es una agrupacion de clases. Existen una serie de paquetes incluidos en el lenguaje y el usuario puede crear sus propios paquetes. Todas las clases que forman parte de un paquete deben estar en el mismo directorio. No tiene que ver directamente con interfaces y herencia, es algo similar a las unidades ya tratadas en el pasado (con pascal, por ejemplo). Define un nuevo ambito: el ambito de paquete.

Object

Todas clas clases heredan de el. Es la clase madre de todas. (puede ser un filon para buscar una clase de la que implementar un tipo generico).

28

Clases / Declaracion de clases

[ modificadores ] class NombreClass { [Atibutos] [Metodos] [clases anidadas] [interfaces] } En java los metodos se implementan en la funcion, no se implementan fuera como podiamos, siq ueriamos, hacer en C++ Si una clase se declara en un paquete 'p' su nombre ser p.nombredeclase. Si es un paquete sin nombre quedaria solo en nombredeclase El ambito del identificador de clase es el paquete en que se ha declarado, sin importar el orden.

Package paquete { class a{ b class b; }; class b { // lo que sea } };

Modificadores
Public: Puede ser accedido por cualquier codigo java que pueda acceder al paquete donde esta declarado. Si no hay public solo se accedera desde su propio paquete. Abstract: Una clase abstract es una clase que es, o debe, considerarse incompleta. Solo las clases abstractas pueden tener metodos abstractos (se definen pero no se implementan, lo definen las clases derivadas). Final: Una clase es final si su definicion es completa y no se desean subclases. (no voy a permitir heredar de ella).

29

Atributos
En Java es muy importante que no haya nada sin inicializar, cosa que si no se hace explicitamente es imposible pues java inicializa automaticamente a valores por defecto. Puedo inicializar atributos en la declaracion: int valor = 10; Los atributos se inicializan en el mismo orden en que aparezcan declarados. Cuando un objeto llama a un metodo, este va marcado con la referencia Ithis para que el metodo sepa que objeto le ha llamado. Asi sabe, por ejemplo, que atributos modificar, etc... Ejemplo class circulo { int x = 10; int y = 12; public void metodo (int x, int y) { this.x = x; this.y = y; } } Java incluye el 'super', que es como una version del this que apunta a la clase base, la superclase. Lo vamos a utilizar para llamar al constructor de una clase padre y cuando queramos invocar metodos y atributos de la clase base que he ocultado.

30 Modificadores de Atributos Niveles de Acceso Paquete Es el nivel por defecto. Pueden acceder los miembros de las clases del paquete. Publico - Public Atributo disponible a todo el que tenga acceso al paquete. Privado Private Solo tienen acceso el resto de miembros de esa clase. Protejido Protected Solo tiene sentido en relaciones de herencia cuando la subclase est presente en un paquete distinto a la superclase. Permite que las clases derivadas tengan acceso incluso entre paquetes.

Package Propia Clase Clase del mismo paquete Clase fuera del paquete Subclase fuera del paquete.

Public

Protected

Private

Hay otros modificadores como transient (el atributo no forma parte de la persistencia) y volatile (indica que este atributo puede ser utilizado por distintos hilos sincronizados).

31

Atributos de clase
Static Cada objeto de una clase va a tener una copia de los atributos. Si lo marco como static indico que hay una sola copia y todos manejan la misma copia. Igual que atributos static tambien hay metodos static que no reciben un this y que solo pueden manejar atributos static.

class test { static int a=10; } test t1 = new test ( ); test t2 = new test ( ); t1.a = 12; t2.a = 30; // Para que no parezca que son dos objetos distintos normalmente se // accede al atributo con el nombre de la clase: ' test.a ' // t1.a ahora devolveria 30.

Final Los atributos final se pretende que sean constantes. La variable de un tipo primitivo declarada como final no puede variar su valor a lo largo de la ejecucion del programa. Si el atributo es la referencia a un objeto, la referencia no cambia pero los atributos del objeto referenciado si que puedo modificarlos (a no ser que tambien sean final a su vez).

32 Ejemplo: import java.lang.*; public class FinalString { final String s=***; // ok final stringbuffer sb = *; // error (debe ser tipo string) final stringbuffer sb = new stringbuffer(*); // ok public class finalstring (string cad) { S = S+cad; //error, s es final. S = S + hd; // ok porque crea, no transforma. Sb = cad+sb; // error, debo usar append en un stringbuffer sb.append(cad); // ok } public static void main (string [ ]args){ finalstring cosa = new finalstring(tururu); system.out.println(sb: + cosa.sb); // ***tururu cosa.sb.append (**tarari); system.out.println(sb: + cosa.sb); // ***tururu**tarari

import java.lang.*; class punto { int x,y, contador; punto (int x, int y) { this.x=x; this.y=y;} static punto origen = new punto (0,0); }; public class teststatic { public void main (string [ ] ){ punto a = new punto (1,1); punto b = new punto (2,2); a.x = 11; a.y = 11; a.contador++; a.origen.contador++; b.contador++ punto.origen = new punto ( 200, 200); {; };

33 Native Es un metodo implementado independiente de plataforma. Normalmente estan en dll's. Se suele hacer asi: public native metodo ( ); Sinchronized Bloquea un metodo hasta que acabe la ejecucion. Impide que otro hilo se ejecute hasta que no se acabe. Solo un hilo a la vez. Es para multihilo y lo veremos mas adelante en el capitulo de hilos.

Constructores
Proceso de creacion de un objeto: 1. Al crear el primer objeto de la clase, o el primer metodo static (el objeto / metodo tiene que estar cargado en memoria). 2. Se ejecutan las inicializaciones static (solo suceden una vez) 3. Cada vez que quiero crear un objeto:

Reservar memoria (para los atributos no static) Se dan los valores por defecto a los atributos. Se ejecutan las inicializaciones de objetos. Se invoca al constructor.

El constructor es un metodo que se llama automaticamente cada vez que se crea un objeto de la clase. En el constructor podemos reservar memoria e inicializar algunos atributos. No tiene valor de retorno y tiene el mismo nombre que la clase. Tienen y reciben como argumento implicito THIS Si no lo creamos java lo crea por defecto. Ese constructor por defecto no recibe argumentos e inicializa los atributos a sus valores por defecto. Los constructores se pueden sobrecargar (se llaman igual pero varia su cadena de argumentos). Un cosntructor puede llamar a otro de su misma clase.

34 Ejemplo:

class punto { int x, y; punto (int x, int y) { this.x = x; this.y = y;

// el this sirve para indicar que es // el atributo y no la variable

} } class puntocolor extend punto { static final blanco = 1, negro = 0; // + - contraste int color; puntocolor (int x, int y, int color){ super (x,y); // llamada a la clase padre this.color = color; } puntocolor (int x, int y) { this (x,y,blanco); } puntocolor ( ) { this (0,0,negro); } Todo esto es sobrecarga de constructores. No tiene sentido crear un constructor privado. Dentro de una clase, los constructores solo pueden ser llamados por otros constructores o por metodos static. Inicializadores Static Metodo que se llama automaticamente al crear la clase (solo se ejecuta una vez) se crean como metodos sin nombre y sin valor de retorno. Static { ------------------------------------------------------};

35 Para que sirven? Para inicializar atributos static. Tambien se usan para llamar a metodos nativos. Es un buen sitio para cargar librerias de los metodos en c++, etc... system.Load ( ) system.LoadLibrary( ); Puede haber varios, pero no tiene mucho sentido ya que todo se puede meter en uno.

Destructores
No hay destructores como en C++ porque el sistema se ocupa de recolectar los objetos que ya no estan referenciados (garbage collector) No sabemos muy bien cuando se va a activar. Hay un metodo que sugiere que se ejecute: system.gc ( ) Si que existen metodos finalizadores a los que se llama cuando se va a destruir un objeto. El recolector de basura solo libera la memoria reservada con new, asi que CUIDADO! Con las funciones C++ que esas no las tiene en cuenta el recolector. El finalizador no tiene valor de retorno ni argumentos y se llama finalize finalize ( ) { ------------------}; system.nmfinalization ( ) sugiere que se finalizen las cosas que quedan pendientes como trabajos de impresion, etc...

36

Herencia
Es una especie de ordenacion de abstracciones class a{ private int a; protected int b; public int c; };

B class b extends a { int d; public void f( ) { this.a = 7; // ERROR, a es privada de la clase a. this.b = 7; this.c = 7; this.d = 7; }

Se hereda todo. Java no permite herencia multiple, solo se puede heredar de una clase base. Todas las clases que nosotros creamos tienen una superclase, y si no lo decimos es por defecto de object (todas heredan de object) Se pueden redefinir metodos y variables llamandolas por el mismo nombre (y mismos argumentos para los metodos). El metodo redefinido OCULTA al otro que sigue siendo accesible con super. El polimorfismo (virtual en c++) ya vuebe definido en Java.

Class derivada extends base { ------------------------------------------------------};

Heredo los atributos con el mismo nivel que tenian en la clase base.

37

Class A { private int a; private int b; protected cambiara(int num) {a=num;} } Class B extends A { int c; public void f( ) { a = 7; // error. B = 7; // ok } } Cambiara (7); // Esto si es corrceto

Una clase puede redefinir cualquiera de los metodos heredados. Si lo marcamos como final no se puede redifinir. Sobrecarga es tener dos metodos con el mismo nombre y distintos argumentos que el compilador elije cual actua en cada caso segun los datos que pasemos en la llamada.

class A { void dibuja ( ) { }; } class B extends A { void dibuja ( ) { }; }

b.dibuja llama al de la clase b (busca el mas especializado). Para llamar al de la clase A se usa super: b.super.dibuja( ) (sustituyendo al b.a::dibuja( ) de C++ ) El metodo redefinido puede ampliar los derechos de acceso de la clase pero nunca restringirlos. Los metodos static no se pueden redifinir.

38

class empleado { private string nombre; private double salario; private date fechaalta; public empleado (string n, double s, int anyo, int mes, int dia) { nombre = n; salario = s; gregoriancalendar calendario = new gregoriancalendar (anyo, mes-1, dia); fechaalta = calendario.gettime( ); } public string getnombre( ) { return nombre;} public string getsalario( ) { return salario;} public string getfechaalta( ) { return fechaalta;} public void misalario (float porcentaje) { double incremento; incremento = salario*porcentaje / 100; salario += incremento; } public incsalario (int incremento) { salario += incremento; } } Vamos a hacer una clase jefe que herede de empleado.

Class jefe extends empleado { private bonus; public setbonus (double b) { bonus = b;} public jefe (string n, double s, int anyo, int mes, int dia, double b) { super (n,s,anyo,mes,dia); bonus=b; } public double getsalario ( ) { double base; base = super.getsalario( ); return base + bonus; }; };

39 Ahora vamos con el programa principal

Public class prueba { public static void main (String [ ] args) { jefe j = new jefe (manuel, 20000, 1987,1,2,3,1200); j.setbonus ( 3000 ); // voy a crear un array de empleados jefes y no jefes juntos. Empleado [ ] lista = new empleado [3]; lista[0] = j; //con una referencia a un objeto de la clase base puedo // apuntar tambien a un objeto de la clase derivada. // Lista[0].setbonus ( 0) no lo podria hacer porque un empleado no tiene bonus.. lista[1] = new empleado ( ------- ); lista[2] = new empleado ( ------ ); for (i=0; i<3; i++) { empleado e = lista[i];
system.out.println(Nombre+e.getnombre+Salario: +e.getsalario);

// si no indicamos nada, los metodos se suponen virtuales, esto es, // busca el metodo mas 'concreto' y usa ese por defecto, siempre y // cuando aparezca en la clase base }

Esto se denomina enlace dinamico pues decide en tiempo de ejecucion a que metodo invoca. En el enlace estatico se decide en la compilacion. Puedo hacer enlace dinamico porque la JVM sabe a que objeto estoy referenciando. El polimorfismo es esto Si no queremos que responda el metodo especifico, sino el de la clase base haremos ese metodo final en la base. Si queremos llamar al metodo de la clase base teniendo otro mas especifico en la derivada lo hacemos con b.super.metodo ( ) Para utilizar un metodo de una clase derivada desde una referencia a la base debemos convertir la referencia a la base. (int) b Homologamente: (Ref. Derivada) Referencia Base

40

base b = new derivada ( );


Todo objeto de la clase derivada es un objeto de la clase base. La asignacion e svalida pero solo manejara atributos y metodos existentes en la clase base. No es ningun riesgo sino una restriccion. derivada d = new base ( );

Voy a convertir un objeto b a uno d, de modo que podria hacer d1.xx. Eso es una conversion explicita ya que si se corre un riesgo y, por supuesto, no lo va a correr el compilador.

Clases y metodos abstractos

Un metodo abstracto no esta definido abstract metodo ( ) { };

Una clase abstract esta por definir, se hace para que la definan sus herederas. Los metodos abstract se heredan como tales y asi permanecen hasta que se redefinen. Un metodo final es constante, no se puede redefinir. De una clase final no se puede heredar. De un objeto final no se puede modificar el valor.

41

Polimorfismo
Vamos a descomponerlo en dos partes explicadas por separado para entenderlo mejor y son:

La conversion de referencias El enlazado Estatico / Dinamico

Conversion de referencias A a; B b; a = new B ( ); Esto es valido siempre que a herede de B. Si en el momento de ejecutarlo b apunta a una clase derivada dara un error de ejecucucion. Se puede acotar el riesgo corrido en estos casos consultando antes de hacer nada a que tipo de objetos esta apuntando b con instanceof( ) if (b instanceof d) d d1 = (d) b; Enlazado Estatico / Dinamico

E. Estatico: invocar. E. Dinamico:

Se define en tiempo de compilacion que metodo se va a Se decide en tiempo de ejecucion.

Si solo se usa sobrecarga es un enlazado estatico. 2 ideas de polimorfismo:


Una variable objeto puede hacer referencia a objetos de las diferentes clases que se deriven de la que se procede. (herencia entre ellas). La JVM sabe cual es el objeto referenciado en cada llamada.

42 Problema: Class A { void f( ) { } } Class B extends A { void f( ); } A a = new B ( ); a.f( ); // ejecuta el de la derivada por existir en la base y esta // mas especificado en la derivada.

Conclusion: Se decide en tiempo de ejecucion que version de un metodo es la que se va a ejecutar y java siempre ejecuta la version mas especializada del metodo (que aparezca en cla clase base).

En C++ respondia el de la clase base y habia que aadir el virtual para que buscase especializaciones en las derivadas (y las usara, claro).

Si b fuera: class B extends A { void f ( ); void g ( ); } A a = new B ( ); a.g( ); //daria error pues g ( ) no esta en a.

Definicion Formal Capacidad de referirse a objetos de clases disitntas en una jerarquia utilizando el mismo elemento del programa para realizar la misma operacion pero de formas distintas.

43 for (i =0; i < lista.length; i++) { empleado e = lista [ i ]; system.out.println(Nombre+e.getnombre( )+Salario: +e.getsalario( )); };

Ahora quiero, si es jefe, que me muestre el bonus.

Class jefe --> public double getbonus { return bonus} system.out.println(Bonus: + e.getbonus( ) );

Eso daria un error de compilacion pues en empleado no hay 'getbonus'

jefe j = (jefe) e; system.out.println(Bonus: + e.getbonus( ) );

Ahora daria fallo de ejecucion cuando resultase que no tiene bonus algun caso especifico.

Solucion: if (e instanceof jefe) { jefe j = (jefe) e; system.out.println( Bonus: + j.getbonus( ) ); }

Icuando haya que recurrir a esto es mejor replantearnos el diseo otra vez pues no es muy bueno tener que ir haciendo estas cosas.

S-ar putea să vă placă și