INTRODUCCIÓN A JAVA UT4. Programación
1. Ventajas de Java.
2. CaracterĂsticas de Java
3. Identificadores Un
identificador en Java es una secuencia ilimitada sin espacios de letras y dígitos Unicode, de forma que el primer símbolo de la secuencia debe ser una letra, un símbolo de subrayado (_) o el símbolo dólar ($). Por ejemplo, son válidos los siguientes identificadores:
x5axn NUM_MAX numCuenta
3. Identificadores A
la hora de nombrar un identificador existen una serie de normas de estilo de uso generalizado que, no siendo obligatorias, se usan en la mayor parte del código Java. Estas reglas para la nomenclatura de variables son las siguientes:
3. Identificadores Java
distingue las mayúsculas de las minúsculas. Por ejemplo, Alumno y alumno son variables diferentes.
No
se suelen utilizar identificadores que comiencen con «$» o «_», además el símbolo del dólar, por convenio, no se utiliza nunca.
No
se puede utilizar el valor booleano (true o false) ni el valor nulo (null).
3. Identificadores Los
identificadores deben ser lo más descriptivos posibles. Es mejor usar palabras completas en vez de abreviaturas crípticas. Así nuestro código será más fácil de leer y comprender. En muchos casos también hará que nuestro código se autodocumente. Por ejemplo, si tenemos que darle el nombre a una variable que almacena los datos de un cliente sería recomendable que la misma se llamara algo así como FicheroClientes o ManejadorCliente, y no algo poco descriptivo como Cl33.
3. Identificadores
4. Palabras reservadas ď ľLas
palabras reservadas, a veces tambiĂŠn llamadas palabras clave o keywords, son secuencias de caracteres formadas con letras ASCII cuyo uso se reserva al lenguaje y, por tanto, no pueden utilizarse para crear identificadores.
4. Palabras reservadas
4. Tipos de variables En
un programa nos podemos encontrar distintos tipos de variables. Las diferencias entre una variable y otra dependerán de varios factores, por ejemplo, el tipo de datos que representan, si su valor cambia o no a lo largo de todo el programa, o cuál es el papel que llevan a cabo en el programa. De esta forma, el lenguaje de programación Java define los siguientes tipos de variables:
a) Variables de tipos primitivos y variables referencia, según el tipo de información que contengan. En función de a qué grupo pertenezca la variable, tipos primitivos o tipos referenciados, podrá tomar unos valores u otros, y se podrán definir sobre ella unas operaciones u otras.
4. Tipos de variables b)Variables y constantes, dependiendo de si su valor cambia o no durante la ejecución del programa. La definición de cada tipo sería: • Variables. Sirven para almacenar los datos durante la ejecución del programa, pueden estar formadas por cualquier tipo de dato primitivo o referencia. Su valor puede cambiar varias veces a lo largo de todo el programa. • Constantes o variables finales. Son aquellas variables cuyo valor no cambia a lo largo de todo el programa.
4. Tipos de variables c) Variables miembro y variables locales, en función del lugar donde aparezcan en el programa. La definición concreta sería: • Variables miembro. Son las variables que se crean dentro de una clase (Componente software reutilizable expresado en términos de atributos y comportamientos o métodos. Los programadores pueden usar sus propias clases o las incluidas en el lenguaje), fuera de cualquier método (Elementos de una clase u objeto compuestos por una serie de sentencias que sirven para describir las acciones a realizar con esa clase u objeto). Pueden ser de tipos primitivos o referencias, variables o constantes.
4. Tipos de variables En un lenguaje puramente orientado a objetos como es Java, todo se basa en la utilización de objetos (Los objetos se crean a partir de clases, y representan casos individuales de una clase), los cuales se crean usando clases. En la siguiente unidad veremos los distintos tipos de variables miembro que se pueden usar. • Variables locales. Son las variables que se crean y usan dentro de un método o, en general, dentro de cualquier bloque de código. La variable deja de existir cuando la ejecución del bloque de código o el método finaliza. Al igual que las variables miembro, las variables locales también pueden ser de tipos primitivos o referencias.
4. Tipos de variables En un lenguaje puramente orientado a objetos como es Java, todo se basa en la utilización de objetos (Los objetos se crean a partir de clases, y representan casos individuales de una clase), los cuales se crean usando clases. En la siguiente unidad veremos los distintos tipos de variables miembro que se pueden usar. • Variables locales. Son las variables que se crean y usan dentro de un método o, en general, dentro de cualquier bloque de código. La variable deja de existir cuando la ejecución del bloque de código o el método finaliza. Al igual que las variables miembro, las variables locales también pueden ser de tipos primitivos o referencias.
4. Tipos de variables ď ľ El
siguiente ejemplo muestra el cĂłdigo para la creaciĂłn de varios tipos de variables. Como ya veremos en apartados posteriores, las variables necesitan declararse, a veces dando un valor y otras con un valor por defecto.
4. Tipos de variables
4. Tipos de variables En
los lenguajes fuertemente tipados, a todo dato (constante, variable o expresión) le corresponde un tipo que es conocido antes de que se ejecute el programa.
El
tipo limita el valor de la variable o expresión, las operaciones que se pueden hacer sobre esos valores, y el significado de esas operaciones. Esto es así porque un tipo de dato no es más que una especificación de los valores que son válidos para esa variable, y de las operaciones que se pueden realizar con ellos.
4. Tipos de variables Debido
a que el tipo de dato de una variable se conoce durante la revisión que hace el compilador para detectar errores, o sea en tiempo de compilación, esta labor es mucho más fácil, ya que no hay que esperar a que se ejecute el programa para saber qué valores va a contener esa variable.
Esto
se consigue con un control muy exhaustivo de los tipos de datos que se utilizan, lo cual tiene sus ventajas e inconvenientes, por ejemplo cuando se intenta asignar un valor de un tipo, a una variable de otro tipo. Sin embargo, en Java, puede haber conversión entre ciertos tipos de datos, como veremos posteriormente.
4. Tipos de variables Ahora
no es el momento de entrar en detalle sobre la conversión de tipos, pero sí debemos conocer con exactitud de qué tipos de datos dispone el lenguaje Java. Ya hemos visto que las variables, según la información que contienen, se pueden dividir en variables de tipos primitivos y variables referencia. Pero ¿qué es un tipo de dato primitivo? ¿Y un tipo referencia? Esto es lo que vamos a ver a continuación. Los tipos de datos en Java se dividen principalmente en dos categorías:
4. Tipos de variables Tipos
de datos sencillos o primitivos. Representan valores simples que vienen predefinidos en el lenguaje; contienen valores únicos, como por ejemplo un carácter o un número.
•
Tipos de datos referencia. Se definen con un nombre o referencia (puntero) que contiene la dirección en memoria de un valor o grupo de valores. Dentro de este tipo tenemos por ejemplo los vectores o arrays, que son una serie de elementos del mismo tipo, o las clases, que son los modelos o plantillas a partir de los cuales se crean los objetos.
En el siguiente apartado vamos a ver con detalle los diferentes tipos de datos que se engloban dentro de estas dos categorías.
4. Tipos de variables Tipos
de datos sencillos o primitivos. Representan valores simples que vienen predefinidos en el lenguaje; contienen valores únicos, como por ejemplo un carácter o un número.
•
Tipos de datos referencia. Se definen con un nombre o referencia (puntero) que contiene la dirección en memoria de un valor o grupo de valores. Dentro de este tipo tenemos por ejemplo los vectores o arrays, que son una serie de elementos del mismo tipo, o las clases, que son los modelos o plantillas a partir de los cuales se crean los objetos.
En el siguiente apartado vamos a ver con detalle los diferentes tipos de datos que se engloban dentro de estas dos categorías.
4. Tipos de variables Los
tipos primitivos son aquéllos datos sencillos que constituyen los tipos de información más habituales: números, caracteres y valores lógicos o booleanos. Al contrario que en otros lenguajes de programación orientados a objetos, en Java no son objetos.
.
4. Tipos de variables Una
de las mayores ventajas de tratar con tipos primitivos en lugar de con objetos, es que el compilador de Java puede optimizar mejor su uso. Otra importante característica, es que cada uno de los tipos primitivos tiene idéntico tamaño y comportamiento en todas las versiones de Java y para cualquier tipo de ordenador..
4. Tipos de variables Esto
quiere decir que no debemos preocuparnos de cómo se representarán los datos en distintas plataformas, y asegura la portabilidad de los programas, a diferencia de lo que ocurre con otros lenguajes. Por ejemplo, el tipo int siempre se representará con 32 bits, con signo, y en el formato de representación complemento a 2, en cualquier plataforma que soporte Java.
4. Tipos de variables
4. Tipos de variables
4. Tipos de variables El
tipo de dato real permite representar cualquier número con decimales. Al igual que ocurre con los enteros, la mayoría de los lenguajes definen más de un tipo de dato real, en función del número de bits usado para representarlos. Cuanto mayor sea ese número:
•
Más grande podrá ser el número real representado en valor absoluto
•
Mayor será la precisión de la parte decimal
4. Declaración e inicialización Las
variables se pueden declarar en cualquier bloque de código, dentro de llaves. Y lo hacemos indicando su identificador y el tipo de dato, separadas por comas si vamos a declarar varias a la vez, por ejemplo:int numAlumnos = 15;
double radio = 3.14, importe = 102.95;
4. Declaración e inicialización En
ocasiones puede que al declarar una variable no le demos valor, ¿qué crees que ocurre en estos casos? Pues que el compilador le asigna un valor por defecto, aunque depende del tipo de variable que se trate:
•
Las variables miembro sí se inicializan automáticamente, si no les damos un valor. Cuando son de tipo numérico, se inicializan por defecto a 0, si don de tipo carácter, se inicializan al carácter null (\0), si son de tipo boolean se les asigna el valor por defecto false, y si son tipo referenciado se inicializan a null.
•
Las variables locales no se inicializan automáticamente. Debemos asignarles nosotros un valor antes de ser usadas, ya que si el compilador detecta que la variable se usa antes de que se le asigne un valor, produce un error. Por ejemplo en este caso:
4. Declaraci贸n e inicializaci贸n int p; int q = p; // error Y tambi茅n en este otro, ya que se intenta usar una variable local que podr铆a no haberse inicializado:
int p; if (. . . ) p = 5 ; int q = p; // error
4. Tipos referenciados A partir de los ocho tipos datos primitivos, se pueden construir otros tipos de datos. Estos tipos de datos se llaman tipos referenciados o referencias, porque se utilizan para almacenar la direcci贸n de los datos en la memoria del ordenador. Int[] arrayDeEnteros; Cuenta cuentaCliente;
4. Tipos referenciados En la primera instrucci贸n declaramos una lista de n煤meros del mismo tipo, en este caso, enteros. En la segunda instrucci贸n estamos declarando la variable u objeto cuentaCliente como una referencia de tipo Cuenta.
4. Tipos referenciados Como comentábamos al principio del apartado de Tipos de datos, cualquier aplicación de hoy en día necesita no perder de vista una cierta cantidad de datos. Cuando el conjunto de datos utilizado tiene características similares se suelen agrupar en estructuras para facilitar el acceso a los mismos, son los llamados datos estructurados. Son datos estructurados los arrays, listas, árboles, etc. Pueden estar en la memoria del programa en ejecución, guardados en el disco como ficheros, o almacenados en una base de datos.
4. Tipos referenciados Ademรกs de los ocho tipos de datos primitivos que ya hemos descrito, Java proporciona un tratamiento especial a los textos o cadenas de caracteres mediante el tipo de dato String. Java crea automรกticamente un nuevo objeto de tipo String cuando se encuentra una cadena de caracteres encerrada entre comillas dobles. En realidad se trata de objetos, y por tanto son tipos referenciados, pero se pueden utilizar de forma sencilla como si fueran variables de tipos primitivos: String mensaje; mensaje= "El primer programa";
4. Tipos referenciados Los tipos de datos enumerados son una forma de declarar una variable con un conjunto restringido de valores. Por ejemplo, los dĂas de la semana, las estaciones del aĂąo, los meses, etc. Es como si definiĂŠramos nuestro propio tipo de datos. La forma de declararlos es con la palabra reservada enum, seguida del nombre de la variable y la lista de valores que puede tomar entre llaves. A los valores que se colocan dentro de las llaves se les considera como constantes, van separados por comas y deben ser valores Ăşnicos.
4. Enumeraciones La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una especie de clase en Java, y todas las clases llevan su contenido entre llaves. Al considerar Java este tipo de datos como si de una clase se tratara, no sólo podemos definir los valores de un tipo enumerado, sino que también podemos definir operaciones a realizar con él y otro tipo de elementos, lo que hace que este tipo de dato sea más versátil y potente que en otros lenguajes de programación.
4. Enumeraciones La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una especie de clase en Java, y todas las clases llevan su contenido entre llaves. Al considerar Java este tipo de datos como si de una clase se tratara, no sólo podemos definir los valores de un tipo enumerado, sino que también podemos definir operaciones a realizar con él y otro tipo de elementos, lo que hace que este tipo de dato sea más versátil y potente que en otros lenguajes de programación.
4. Enumeraciones
4. Enumeraciones La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una especie de clase en Java, y todas las clases llevan su contenido entre llaves. Al considerar Java este tipo de datos como si de una clase se tratara, no sólo podemos definir los valores de un tipo enumerado, sino que también podemos definir operaciones a realizar con él y otro tipo de elementos, lo que hace que este tipo de dato sea más versátil y potente que en otros lenguajes de programación.
4. Enumeraciones La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una especie de clase en Java, y todas las clases llevan su contenido entre llaves. Al considerar Java este tipo de datos como si de una clase se tratara, no sólo podemos definir los valores de un tipo enumerado, sino que también podemos definir operaciones a realizar con él y otro tipo de elementos, lo que hace que este tipo de dato sea más versátil y potente que en otros lenguajes de programación.
4. Literales literales enteros se pueden representar en tres notaciones:
Los
Decimal:
por ejemplo 20. Es la forma más común.
Octal:
por ejemplo 024. Un número en octal siempre empieza por cero, seguido de dígitos octales (del 0 al 7).
Hexadecimal:
por ejemplo 0x14. Un número en hexadecimal siempre empieza por 0x seguido de dígitos hexadecimales (del 0 al 9, de la 'a' a la 'f' o de la 'A' a la 'F').
4. Literales constantes literales de tipo long se le debe añadir detrás una l ó L, por ejemplo 873L, si no se considera por defecto de tipo int. Se suele utilizar L para evitar la confusión de la ele minúscula con 1.
Las
4. Literales literales reales o en coma flotante se expresan con coma decimal o en notación científica, o sea, seguidos de un exponente e ó E. El valor puede finalizarse con una f o una F para indica el formato float o con una d o una D para indicar el formato double (por defecto es double). Por ejemplo, podemos representar un mismo literal real de las siguientes formas: 13.2, 13.2D, 1.32e1, 0.132E2. Otras constantes literales reales son por ejemplo: .54, 31.21E-5, 2.f, 6.022137e+23f, 3.141e-9d.
Los
4. Literales
4. Literales literales de cadenas de caracteres se indican entre comillas dobles. En el ejemplo anterior "El primer programa" es un literal de tipo cadena de caracteres. Al construir una cadena de caracteres se puede incluir cualquier carácter Unicode excepto un carácter de retorno de carro, por ejemplo en la siguiente instrucción utilizamos la secuencia de escape \" para escribir dobles comillas dentro del mensaje:
Los
String
texto = "Juan dijo: \"Hoy hace un día fantástico...\"";
5. Operadores operadores llevan a cabo operaciones sobre un conjunto de datos u operandos, representados por literales y/o identificadores. Los operadores pueden ser unarios, binarios o terciarios, según el número de operandos que utilicen sean uno, dos o tres, respectivamente. Los operadores actúan sobre los tipos de datos primitivos y devuelven también un tipo de dato primitivo.
Los
5. Operadores Los
operadores se combinan con los literales y/o identificadores para formar expresiones. Una expresión es una combinación de operadores y operandos que se evalúa produciendo un único resultado de un tipo determinado.
El
resultado de una expresión puede ser usado como parte de otra expresión o en una sentencia o instrucción. Las expresiones, combinadas con algunas palabras reservadas o por sí mismas, forman las llamadas sentencias o instrucciones.
5. Operadores aritmĂŠticos
5. Operadores aritmĂŠticos
5. Operadores de asignaci贸n
5. Operadores ? operador condicional ?: sirve para evaluar una condición y devolver un resultado en función de si es verdadera o falsa dicha condición. Es el único operador ternario de Java, y como tal, necesita tres operandos para formar una expresión.
El
5. Operadores ? El
primer operando se sitúa a la izquierda del símbolo de interrogación, y siempre será una expresión booleana, también llamada condición. El siguiente operando se sitúa a la derecha del símbolo de interrogación y antes de los dos puntos, y es el valor que devolverá el operador condicional si la condición es verdadera. El último operando, que aparece después de los dos puntos, es la expresión cuyo resultado se devolverá si la condición evaluada es falsa. condición ? expl : exp2
5. Operadores ? Por
ejemplo, en la expresión: (x>y)?x:y;
evalúa la condición de si x es mayor que y, en caso afirmativo se devuelve el valor de la variable x, y en caso contrario se devuelve el valor de y.
Se
5. Operadores ? Por
ejemplo, en la expresión: (x>y)?x:y;
evalúa la condición de si x es mayor que y, en caso afirmativo se devuelve el valor de la variable x, y en caso contrario se devuelve el valor de y.
Se
5. Operadores Relacional Los
operadores relacionales se utilizan para comparar datos de tipo primitivo (numérico, carácter y booleano). El resultado se utilizará en otras expresiones o sentencias, que ejecutarán una acción u otra en función de si se cumple o no la relación.
Estas
expresiones en Java dan siempre como resultado un valor booleano true o false. En la tabla siguiente aparecen los operadores relacionales en Java.
5. Operadores Relacional
5. Operandos Relacional
5. Operadores Lógicos Los operadores lógicos realizan operaciones sobre valores booleanos, o resultados de expresiones relacionales, dando como resultado un valor booleano. Los operadores lógicos los podemos ver en la tabla que se muestra a continuación. Existen ciertos casos en los que el segundo operando de una expresión lógica no se evalúa para ahorrar tiempo de ejecución, porque con el primero ya es suficiente para saber cuál va a ser el resultado de la expresión.
5. Operadores Lógicos
Por ejemplo, en la expresión a && b si a es falso, no se sigue comprobando la expresión, puesto que ya se sabe que la condición de que ambos sean verdadero no se va a cumplir. En estos casos es más conveniente colocar el operando más propenso a ser falso en el lado de la izquierda. Igual ocurre con el operador ||, en cuyo caso es más favorable colocar el operando más propenso a ser verdadero en el lado izquierdo.
5. Operadores L贸gicos
5. Operandos L贸gicos
5. Operadores de bits Los operadores a nivel de bits se caracterizan porque realizan operaciones sobre nĂşmeros enteros (o char) en su representaciĂłn binaria, es decir, sobre cada dĂgito binario.
5. Operadores de bits
6. Alternativas simples Puede ser del tipo: Condicional
simple: if
Condicional
doble: if ... else ...
Condicional
múltiple: if .. else if ..
6. Alternativas simples La condición debe ser una expresión booleana es decir debe dar como resultado un valor booleano (true ó false). Condicional simple: se evalúa la condición y si ésta se cumple se ejecuta una determinada acción o grupo de acciones. En caso contrario se saltan dicho grupo de acciones. if(expresión_booleana){ instrucción 1 instrucción 2 ....... }
6. Alternativas simples
6. Alternativas dobles Se evalúa la condición y si ésta se cumple se ejecuta una determinada instrucción o grupo de instrucciones. Si no se cumple se ejecuta otra instrucción o grupo de instrucciones.
if(expresión booleana){ instrucciones 1 } else{ instrucciones 2 }
6. Alternativas dobles
6. Alternativas múltiples La
forma general de la instrucción switch en Java es la siguiente:
switch (expresión_entera){ case constante1: –
instrucciones;
–
break;
case constante 2: –
instrucciones;
–
break;
··· default: instrucciones; }
6. Alternativas mĂşltiples
7. Trabajos con cadenas ď ľ Ya
hemos visto en el apartado de literales que el objeto String se corresponde con una secuencia de caracteres entrecomillados, como por ejemplo "hola". Este literal se puede utilizar en Java como si de un tipo de datos primitivo se tratase, y, como caso especial, no necesita la orden new para ser creado.
7. Trabajos con cadenas No se trata aquí de que nos adentremos en lo que es una clase u objeto, puesto que lo veremos en unidades posteriores, y trabajaremos mucho sobre ello. Aquí sólo vamos a utilizar determinadas operaciones que podemos realizar con el objeto String, y lo verás mucho más claro con ejemplos descriptivos.
7. Trabajos con cadenas aplicar una operación a una variable de tipo String, escribiremos su nombre seguido de la operación, separados por un punto. Entre las principales operaciones que podemos utilizar para trabajar con cadenas de caracteres están las siguientes:
Para
7. Trabajos con cadenas Creación.
Como hemos visto en el apartado de literales, podemos crear una variable de tipo String simplemente asignándole una cadena de caracteres encerrada entre comillas dobles.
Obtención
de longitud. Si necesitamos saber la longitud de un String, utilizaremos el método length().
Concatenación.
Se utiliza el operador + o el método concat() para concatenar cadenas de caracteres.
7. Trabajos con cadenas Comparación.
El método equals() nos devuelve un valor booleano que indica si las cadenas comparadas son o no iguales. El método equalsIgnoreCase() hace lo propio, ignorando las mayúsculas de las cadenas a considerar.
Obtención
de subcadenas. Podemos obtener cadenas derivadas de una cadena original con el método substring(), al cual le debemos indicar el inicio y el fin de la subcadena a obtener.
7. Trabajos con cadenas Cambio
a mayúsculas/minúsculas. Los métodos toUpperCase() y toLowerCase() devuelven una nueva variable que transforma en mayúsculas o minúsculas, respectivamente, la variable inicial.
Valueof.
Utilizaremos este método para convertir un tipo de dato primitivo (int, long, float, etc.) a una variable de tipo String.
7. Trabajos con cadenas
7. Trabajos con cadenas 1. Contar el nĂşmero de vocales que se encuentran en una cadena. 2. Contar el nĂşmero de consonantes que se encuentran en una cadena. 3. Dada una Cadena de caracteres invertirla. 4. Contar cuantas veces se encuentra una subcadena dentro de una cadena.
7. Bucles WHILE: Las instrucciones se repiten mientras la condici贸n sea cierta. La condici贸n se comprueba al principio del bucle por lo que las acciones se pueden ejecutar 0 贸 m谩s veces.
7. Bucles
8. OrientaciĂłn a objetos Los programas realizados mediante el paradigma de la POO solamente tienen objetos.
Todos los objetos pertenecen a una clase, por ejemplo, mi perro Sultan pertenecerĂa a la clase perro. Todos los objetos de la clase perro se identificarĂĄn, entre otros atributos, con un nombre (en su caso Sultan), un color de piel (negro), una edad (en su caso 2 aĂąos), y raza pitbull.
8. Orientación a objetos En un símil con la costura, las clases serían los patrones y los objetos las prendas. Las clases son los moldes de los cuales se generan los objetos. Los objetos se instancian y se generan, instancia y objeto son sinónimos. Por ejemplo. Sultán será un objeto concreto de la clase perro.
8. Orientación a objetos Un objeto tiene una serie de características como son las siguientes: Identidad.
Cada objeto es único y diferente de otro objeto. Mi perro Sultán es diferente a otros perros aunque estos sean negros, tengan 2 años y sean pitbull.
Estado.
El estado serán los valores de los atributos del objeto, en el caso de los objetos de la clase perro serían nombre, color, edad, raza, etc.
Comportamiento.
El comportamiento serían los métodos o procedimientos que realiza dicho objeto. Dependiendo del tipo o clase de objeto, estos realizarán unas operaciones u otras (correr, ladrar, nadar etc.).
8. Orientación a objetos Mensajes Los objetos interactúan unos con otros a través del paso de mensajes. Cuando un objeto recibe un mensaje lo que hace es ejecutar el método asociado. Métodos Los métodos son los procedimientos que ejecuta el objeto cuando recibe un mensaje vinculado a ese método concreto. En ocasiones este método envía mensajes a otros objetos, solicitando acciones o información.
8. Orientaci贸n a objetos
8. Orientación a objetos LOS OBJETOS Los objetos del mundo real tienen dos características principales: • Estado. • Comportamiento.
8. Orientación a objetos Los perros, por ejemplo, tienen un estado que puede ser el color de piel, el nombre, si ladran o no, etc. Y también un comportamiento (correr, nadar, comer, etc.). Algunos objetos son más complejos que otros, por ejemplo, mi consola es mucho más compleja que mi linterna de espeleología. Mi linterna tiene solo dos estados (encendida y apagada) y la interfaz es sumamente sencilla (apagar y encender). Al programar una aplicación en Java deberemos de modelar estos estados y comportamientos en clases y objetos.
8. Orientación a objetos La programación orientada a objetos proporciona los siguientes beneficios: Modularidad
El código fuente de un objeto puede mantenerse y reescribirse sin que ello implique la reprogramación del código de otros objetos de la aplicación.
Reutilización
de código. Es muy sencillo utilizar clases y objetos de terceras personas. La ventaja de esto es que no tenemos que conocer los detalles de su implementación interna sino solamente su interfaz.
•
8. Orientación a objetos La programación orientada a objetos proporciona los siguientes beneficios: Facilidad
de testeo y reprogramación. Si tenemos un objeto que está dando problemas en una aplicación no tenemos que reescribir el código de toda la aplicación, sino que tenemos que reemplazar el objeto por otro similar, o bien reprogramarlo.
Ocultación
de información. En la POO se ocultan los detalles de implementación y lo que priva es la interfaz.
8. Orientación a objetos La programación orientada a objetos proporciona los siguientes beneficios: Facilidad
de testeo y reprogramación. Si tenemos un objeto que está dando problemas en una aplicación no tenemos que reescribir el código de toda la aplicación, sino que tenemos que reemplazar el objeto por otro similar, o bien reprogramarlo.
Ocultación
de información. En la POO se ocultan los detalles de implementación y lo que priva es la interfaz.
8. Orientación a objetos A continuación, se citan algunas de las características fundamentales de la programación orientada a objetos: Abstracción.
Según la RAE abstraer es "separar por medio de una operación intelectual las cualidades de un objeto para considerarlas aisladamente o para considerar el mismo objeto en su pura esencia o noción".
Cuando se programa orientado a objetos lo que se hace es abstraer las características de los objetos que van a tomar parte del programa y crear las clases con sus atributos y sus métodos.
8. Orientación a objetos Encapsulamiento.
Cuando se programa orientado a objetos, los objetos se ven según su comportamiento externo.
Por ejemplo, en la clase perro se le puede enviar un mensaje para que corra y el objeto perro ejecutará su método correr. Lo más interesante de todo esto es que el programador no tiene por qué saber cómo funciona internamente el método correr, simplemente lo ejecuta.
8. Orientación a objetos Herencia.
Todas las clases se estructuran formando jerarquías de clases.
8. Orientación a objetos Las clases pueden tener superclases (la clase pájaro tiene la superclase animal) y subclases (la clase pájaro tiene las subclases loro y canario). En Java una clase SOLO puede tener UNA superclase Cuando una clase hereda de una superclase obtiene los métodos y las propiedades de dicha superclase. Además, la funcionalidad propia de la misma clase se combinará con la heredada de la superclase.
8. Orientación a objetos Polimorfismo.
El polimorfismo permite crear varias formas del mismo método, de tal manera que un mismo método ofrezca comportamientos diferentes.
8. Orientación a objetos. Propiedades Y Métodos De Los Objetos Datos,
propiedades o atributos son sinónimos y referencian a las variables de una clase.
En
una clase se agrupan datos (variables) y métodos (funciones). Todas las variables o funciones creadas en Java deben pertenecer a una clase, con lo cual no existen variables o funciones globales como en otros lenguajes de programación.
En
una clase Java los atributos pueden ser tipos primitivos (char, int, boolean, etc.) o bien pueden ser objetos de otra clase. Por ejemplo, un objeto de la clase coche puede tener un objeto de la clase motor.
8. Orientaci贸n a objetos. Propiedades Y M茅todos De Los Objetos
8. Orientaci贸n a objetos. Propiedades Y M茅todos De Los Objetos
8. Orientación a objetos. Propiedades Y Métodos De Los Objetos Como
se puede ver en el código anterior existen dos clases diferentes (Perro y Test), las cuales residirán en dos ficheros diferentes (perro.java y test.java). En la clase test se crea un objeto de la clase perro y se llama a los métodos para actualizar la edad y mostrarla por pantalla.
En ningún momento la clase test puede acceder a los métodos o atributos prívate de la clase pájaro (esto es gracias a la abstracción), ni falta que le hace porque lo único que debe de conocer la clase test son los métodos públicos para utilizar la clase.
8. Orientaci贸n a objetos. Propiedades Y M茅todos De Los Objetos
8. Orientación a objetos. Constructores y destructores de objetos En Java existen unos métodos especiales que son los constructores y destructores del objeto. Estos métodos son opcionales, es decir, no es obligatorio programarlos salvo que se necesiten. El constructor del objeto es un procedimiento llamado automáticamente cuando se crea un objeto de esa clase. Si el programador no los declara, Java generará uno por defecto. La función del constructor es inicializar el objeto.
8. Orientación a objetos. Constructores y destructores de objetos El destructor, por el contrario, se ejecutará automáticamente siempre que se destruye un objeto de dicha clase. Los destructores, generalmente, se utilizan para liberar recursos y cerrar flujos abiertos (realiza una limpieza final). Los destructores no reciben parámetros, al contrario que los constructores, la sobrecarga no está permitida. En Java, la destrucción de objetos sigue otra filosofía distinta a la de otros lenguajes de programación. El sistema de destrucción de objetos ya se verá más adelante en profundidad.
8. Orientaci贸n a objetos. Constructores y destructores de objetos
8. Orientaci贸n a objetos. Constructores y destructores de objetos
8. Orientación a objetos. Constructores y destructores de objetos EJERCICIO: Crear una clase Aula que tenga como atributos el numero de alumnos, y la media de edad de los alumnos . Se deberán implementar dos constructores Aula: El
primero de ellos no aceptara parámetros, e inicializara las variables a 0.
El
segundo aceptara como parámetros el numero de alumnos y la media de edad de los alumnos y se lo asociara a las variables ya definidas.
Probar que lo implementado funciona de manera correcta.
8. Orientación a objetos. Uso de métodos estáticos y dinámicos Cuando un método o atributo se define como static quiere decir que se va a crear para esa clase solo una instancia de ese método o atributo. En el siguiente caso se ve como se ha creado un atributo numPerros que contará el número de perros que se van generando. Si ese atributo no fuera estático sería imposible contar los pájaros, puesto que en cada instancia del objeto se crearía una variable numPerros. De la misma manera, el método nuevoPerro(), muestraPerros() o el método main() tienen sentido que sean estáticos.
8. Orientación a objetos. Uso de métodos estáticos y dinámicos
El atributo numPerros y los métodos 8. Orientación nuevoPerro(), a objetos. muestraPerros() y main() se estáticos y dinámicos comparten por todos los objetos creados de la clase pájaro.
Uso de métodos
8. Orientación a objetos. Constructores y destructores de objetos EJERCICIO: Crear un atributo numAulas que contará el número de aulas que se van generando. De la misma manera, se deberán crear los métodos nuevoAula(), muestraAulas(), ademas del método main().
8. Orientación a objetos. Constructores y destructores de objetos EJERCICIO: Modificar el código anterior añadiendo un atributo (variable) que almacene los metros recorridos. Crear dos métodos: Caminar:
incrementara los metros en uno cada vez que se ejecute.
Correr:
incrementara los metros en tres cada vez que se ejecute.
Probar que lo implementado funciona de manera correcta.
8. Orientación a objetos. Librerías De Objetos (Paquetes) Librería o paquete es lo mismo. Un paquete o package es un conjunto de clases relacionadas entre sí, las cuales están ordenadas de forma arbitraria. Las clases que forman parte de un paquete no derivan todas ellas de una misma superclase. Por ejemplo, el paquete java.io agrupa las clases que permiten a un programa realizar la entrada y salida de información. Un paquete también puede contener a otros paquetes. Con el uso de paquetes se evitan conflictos, como llamar dos clases con el mismo nombre (si existen, estarán cada una en paquetes diferentes).
8. Orientación a objetos. Librerías De Objetos (Paquetes) Al estar en el mismo paquete, las clases de dichos paquetes tendrán un acceso privilegiado a los miembros de dato y métodos de otras clases del mismo paquete. Gracias a los paquetes es posible organizar las clases en grupos. Las clases de un mismo paquete están relacionadas entre sí.
8. OrientaciĂłn a objetos. LibrerĂas De Objetos (Paquetes) Imaginemos que queremos utilizar una clase contenida en algĂşn paquete, la forma de utilizar dicha clase es generalmente utilizando la sentencia import. Podemos importar una clase individual, como por ejemplo: import java.lang.System; // Se importa la clase System
8. Orientación a objetos. Librerías De Objetos (Paquetes) O bién podemos importar todas las clases de un paquete: import java.awt.*; En este caso podremos utilizar todas las clases del paquete. Un ejemplo de esto sería el siguiente: import java.awt.*; Frame fr = new Frame( "Panel ejemplo" );
8. Orientación a objetos. Librerías De Objetos (Paquetes) También es posible utilizar la clase sin utilizar la sentencia import: java.awt.Frame fr = new java.awt.Frame( "Panel ejemplo" ); Generalmente, cuando se van a crear varios objetos de una o varias clases de un paquete no se utiliza esta última opción porque hay que escribir mucho código.
8. Orientaci贸n a objetos. Librer铆as De Objetos (Paquetes)
8. Orientaci贸n a objetos. Librer铆as De Objetos (Paquetes)
8. Orientaci贸n a objetos. Librer铆as De Objetos (Paquetes)
9. Excepciones Una
excepción es un evento que ocurre durante la ejecución del programa que interrumpe el flujo normal de las sentencias.
Algo
que altera la ejecución normal.
Muchas
clases de errores pueden generar excepciones desde problemas de hardware, como la avería de un disco duro, a los simples errores de programación, como tratar de acceder a un elemento de un array fuera de sus límites.
9. Excepciones En
programación siempre se producen errores, más o menos graves, pero que hay que gestionar y tratar correctamente.
Por
ello en java disponemos de un mecanismo consistente en el uso de bloques try/catch/finally.
La
técnica básica consiste en colocar las instrucciones que podrían provocar problemas dentro de un bloque try, y colocar a continuación uno o más bloques catch, de tal forma que si se provoca un error de un determinado tipo, lo que haremos será saltar al bloque catch capaz de gestionar ese tipo de error específico.
9. Excepciones El
bloque catch contendrá el codigo necesario para gestionar ese tipo específico de error. Suponiendo que no se hubiesen provocado errores en el bloque try, nunca se ejecutarían los bloques catch.
Veamos
ahora la estructura del bloque try/catch/finally:
try { //Código que puede provocar errores } catch(Tipo1 var1) { //Gestión del error var1, de tipo Tipo1 } [ catch(TipoN varN) { //Gestión del error varN, de tipo TipoN } ] [ finally { //Código de finally } ]
9. Excepciones Como
podemos ver es obligatorio que exista la zona try, o zona de pruebas, donde pondremos las instrucciones problemáticas.
Después
vienen una o más zonas catch, cada una especializada en un tipo de error o excepción. Por último está la zona finally, encargada de tener un código que se ejecutará siempre, independientemente de si se produjeron o no errores.
Se
puede apreciar que cada catch se parece a una función en la cuál sólo recibimos un objeto de un determinado tipo, precisamente el tipo del error. Es decir sólo se llamará al catch cuyo argumento sea coincidente en tipo con el tipo del error generado.
9. Jerarquia de Excepciones
9. Excepciones
9. Excepciones
9. Excepciones
9. Excepciones
9. Excepciones
10. Recursividad La
recursividad es una técnica potente de programación que puede utilizarse en lugar de la iteración para resolver determinados tipos de problemas.
Un
método es recursivo cuando entre sus instrucciones se encuentra una llamada a sí mismo.
Por
ejemplo, para escribir un método que calcule el factorial de un número entero no negativo, podemos hacerlo a partir de la definición de factorial:
0! = 1 n! = n * (n–1) * (n–2) * ... * 3 * 2 * 1 si n>0
10. Recursividad Esto
un
dará lugar a una solución iterativa en Java mediante bucle for:
10. Recursividad Pero
existe otra definición de factorial en función de sí misma:
0! = 1 n! = n · (n – 1)! , factorial de n-1)
si n > 0
(El factorial de n es n por el
10. Recursividad Esta
definición da lugar a una solución recursiva del factorial en Java:
10. Recursividad La
solución iterativa es fácil de entender. Utiliza una variable para acumular los productos y obtener la solución. En la solución recursiva se realizan llamadas al propio método con valores de n cada vez más pequeños para resolver el problema.
Cada
vez que se produce una nueva llamada al método se crean en memoria de nuevo las variables y comienza la ejecución del nuevo método.
10. Recursividad ď ľ Para
entender el funcionamiento de la recursividad, podemos pensar que cada llamada supone hacerlo a un mĂŠtodo diferente, copia del original, que se ejecuta y devuelve el resultado a quien lo llamĂł.
10. Recursividad Un método recursivo debe contener: Uno
o más casos base: casos para los que existe una solución directa.
Una
o más llamadas recursivas: casos en los que se llama sí mismo
10. Recursividad Caso base: Siempre ha de existir uno o más casos en los que los valores de los parámetros de entrada permitan al método devolver un resultado directo. Estos casos también se conocen como solución trivial del problema. En el ejemplo del factorial el caso base es la condición: if (n==0)
return 1;
si n=0 el resultado directo es 1 No se produce llamada recursiva
10. Recursividad Llamada recursiva: Si los valores de los parámetros de entrada no cumplen la condición del caso base se llama recursivamente al método. En las llamadas recursivas el valor del parámetro en la llamada se ha de modificar de forma que se aproxime cada vez más hasta alcanzar al valor del caso base. En el ejemplo del factorial en cada llamada recursiva se utiliza n-1 return n * ( factorial(n-1) ); por lo que en cada llamada el valor de n se acerca más a 0 que es el caso base.
10. Recursividad La recursividad es especialmente apropiada cuando el problema a resolver (por ejemplo calculo del factorial de un número) o la estructura de datos a procesar (por ejemplo los árboles) tienen una clara definición recursiva. No se debe utilizar la recursión cuando la iteración ofrece una solución obvia. Cuando el problema se pueda definir mejor de una forma recursiva que iterativa lo resolveremos utilizando recursividad.
10. Recursividad Para medir la eficacia de un algoritmo recursivo se tienen en cuenta tres factores: Tiempo Uso
de ejecución
de memoria
Legibilidad
y facilidad de comprensión
Las soluciones recursivas suelen ser más lentas que las iterativas por el tiempo empleado en la gestión de las sucesivas llamadas a los métodos. Además consumen más memoria ya que se deben guardar los contextos de ejecución de cada método que se llama.
10. Recursividad A pesar de estos inconvenientes, en ciertos problemas, la recursividad conduce a soluciones que son mucho más fáciles de leer y comprender que su correspondiente solución iterativa. En estos casos una mayor claridad del algoritmo puede compensar el coste en tiempo y en ocupación de memoria. De todas maneras, numerosos problemas son difíciles de resolver con soluciones iterativas, y sólo la solución recursiva conduce a la resolución del problema (por ejemplo, Torres de Hanoi o recorrido de Árboles).
10. Recursividad Ejemplos: Funci贸n dam dam(0)=1 dam(n)=2n*dam(n-1)
10. Recursividad
10. Recursividad Ejemplos: Funci贸n redam redam(2)=2 redam(1)=1 redam(n)=redam(n-1)*redam(n-2)
10. Recursividad
10. Recursividad
10. Recursividad
10. Recursividad
10. Recursividad
10. Recursividad
11. Concepto de clase En la programación orientada a objetos las clases permiten a los programadores abstraer el problema a resolver ocultando los datos y la manera en la que estos se manejan para llegar a la solución (se oculta la implementación). En un programa orientado a objetos es impensable que desde el mismo programa se acceda directamente a las variables internas de una clase si no es a través de métodos getters y setters (por ejemplo getEdad()) o setEdad()).
11. Concepto de clase Por lo tanto, en la definición de nuestras clases deberemos de cuidar lo siguiente: No
se deberá tener acceso directo a la estructura interna de las clases. El acceso a los atributos será a través de getters y setters.
En
el supuesto que haya que modificar el código sin modificar el interfaz con otras clases o programas, esto debería poder hacerse sin tener ninguna repercusión con otras clases o programas. Se busca que las clases tengan un alto grado de cohesión (independencia).
11. Concepto de clase Ejercicio: Diseña
una clase Calendario, que contendrá los dias festivos y los días laborales.
Crea
un constructor que inicialice los atributos.
Crea
un método get y set para obtener y modificar cada uno de ellos.
Utiliza
todo lo anterior en el método main.
11. 1. Control de acceso En Java hay varios niveles de acceso a los miembros de una clase: public (acceso publico), protected (acceso protegido), prívate (acceso privado), no especificado (acceso en su paquete). Cuando especificamos el nivel de acceso a un atributo o método de una clase, lo que estamos especificando es el nivel de accesibilidad que va a tener ese atributo o método que puede ir desde el acceso más restrictivo (prívate) al menos restrictivo (public). Para un mayor control de acceso se recomienda etiquetar los miembros de una clase como public, private y protected.
11. 1. Control de acceso
11. 1. Control de acceso EJERCICIO. Vamos a crear la siguiente estructura
11. 1. Control de acceso EJERCICIO. Cont Dentro de paquete1, crearemos dos clases: P1Clase1, y P1Clase2. Dentro de paquete2, crearemos dos clases: P2Clase1, y P2Clase2.
Crearemos atributos y mĂŠtodos en cada una de ellas y probaremos con los modificadores de acceso, si podemos acceder a otras clases del mismo paquete o de distinto paquete.
11. 1. Control de acceso Cuando creamos una clase en Java es posible definir la relación que esa clase tiene con otras clases o la relación que tendrá esa clase con las clases de su mismo paquete. Una clase definida como pública puede ser utilizada por las clases de su paquete y otros paquetes mientras que una clase no definida como pública solamente podrá ser utilizada por las clases de su propio paquete.
11. 1. Control de acceso
11. 2. This Java proporciona una referencia al objeto con el que se está trabajando. Esta referencia se denomina this, que no es ni más ni menos que el objeto que está ejecutando el método. En los ejemplos que hemos estado utilizando en muchas ocasiones se obviaba esta referencia puesto que se sobreentiende que el objeto está invocando al método. En algunas ocasiones nos va a servir para resolver ambigüedades o para devolver referencias al propio objeto.
11. 2. This
11. 2. This Ejercicio. Modifica los mĂŠtodos y constructores de la clase Calendario para usar this.
11. 3. Constructores (conceptos adicionales) Java, al igual que hace con las variables, cuando va a crear un objeto, lo que hace es reservar espacio en memoria para dicho objeto. En esta fase de construcción del objeto Java crea un constructor público por defecto del objeto. No obstante, si el programador lo cree oportuno se puede un constructor diferente que satisfaga las necesidades de la clase. El constructor se llama de forma automática siempre que se crea un objeto de una clase.
11. 3. Constructores (conceptos adicionales) Por lo tanto tenemos dos tipos de constructores: Constructor
por defecto. Cuando no se especifica en el código. Se ejecuta siempre de manera automática e inicializa el objeto con los valores especificados o predeterminados del sistema.
Constructor
definido. Puede ser más de uno. Tiene el mismo nombre de la clase. Nunca devuelve un valor y no puede ser declarado como static, final, native, abstract o synchronized. Por regla general se declaran los constructores como públicos (public) para que puedan ser utilizados por cualquier otra clase.
Cuando existe más de un constructor para una clase se dice que este está sobrecargado.
11. 3. Constructores (conceptos adicionales) ¿Qué hace Java cuando tiene que cargar una clase? 1.Antes de crear el primer objeto, Java localiza el fichero de la clase en disco (el fichero .class) y lo carga en memoria. 2.Se ejecutarán los inicializadores static de la clase (se explican mas adelante). 3. Se crea el objeto
11. 3. Constructores (conceptos adicionales) ÂżQuĂŠ hace Java cuando se crea un objeto? 1. Crea memoria para el objeto mediante el operador new. 2. Inicializa los atributos del objeto (solamente los que no fueron inicializados). 3. Se ejecutan los inicializadores de objeto. 4. Llama al constructor adecuado.
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) SOBRECARGA DEL CONSTRUCTOR ¿Cuándo necesitamos sobrecargar o definir múltiples constructores para una clase? Se definen múltiples constructores para una clase cuando el objeto pueda ser inicializado de múltiples formas. Al sobrecargar un constructor variaremos el tipo y número de parámetros que recibe.
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) Cuando existe más de un constructor para una clase se dice que este está sobrecargado. Cuando creamos un objeto con new, Java elige el constructor más adecuado dependiendo de los parámetros utilizados. Como según el ejemplo de la clase rectángulo tenemos tres constructores, la creación de cada uno de los objetos siguientes se realizará con un constructor diferente:
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) ASIGNACION DE OBJETOS Cuando trabajamos con objetos estamos trabajando con referencias. Una referencia es una localizaci贸n de la memoria donde se encuentra el objeto. Como ya se ha dicho, hay que tener en cuenta la utilizaci贸n de estas referencias cuando se trabaja con objetos.
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) Como esta clase es pública, desde el método main de otra clase ejecuto el siguiente código:
11. 3. Constructores (conceptos adicionales) La
pregunta es la siguiente: ¿Qué mostrará el programa por pantalla? Tenemos dos opciones:
11. 3. Constructores (conceptos adicionales) La respuesta es la opción 2. Esto es así porque cuando se hace r2 = r1 se copia la referencia al objeto y no el contenido de un objeto en otro. En la siguiente figura se puede ver esto de forma gráfica:
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) Entonces, 驴c贸mo se copia el contenido de un objeto a otro? Una soluci贸n sencilla es utilizar un constructor de copia.
11. 3. Constructores (conceptos adicionales) CONSTRUCTOR COPIA Con un constructor de copia se inicializa un objeto asignándole los valores de otro objeto diferente de la misma clase. Este constructor de copia tendrá solo un parámetro: un objeto de la misma clase. Un constructor de copia para nuestra clase anterior rectángulo sería el siguiente:
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) En el caso de que tenga este nuevo constructor, puedo hacer uso del mismo cuando cree un objeto r2 de la misma clase:
11. 3. Constructores (conceptos adicionales) La utilizaciรณn del constructor copia "copiarรก" los miembros del objeto r1 al objeto r2. El programa anterior ahora mostrarรก por pantalla lo siguiente:
Alto: 7 Ancho: 5
11. 3. Constructores (conceptos adicionales) EJERCICIO: Crea una clase Arbol, que incluya los atributos edad y tipo, dos constructores (uno vacío, y otro que acepte parámetros) y los métodos obtenerEdad, obtenerTipo, modificarEdad, y modificarTipo. Crea otra clase denominada UsaArbol, y crea dentro del método main, cuatro objetos de la clase Arbol( Arbol1,Arbol2 , Arbol3 y Arbol4), siendo Arbol3 una copia de Arbol1 y Arbol4 una copia de Arbol2
11. 3. Constructores (conceptos adicionales) INICIALIZADORES STATIC Los inicializadores static son un bloque de c贸digo que se ejecutar谩 una vez solamente cuando se utilice la clase. Importante: A diferencia del constructor que se llama cada vez que se crea un objeto de dicha clase, el inicializador solamente se ejecuta la primera vez que se utiliza la clase.
11. 3. Constructores (conceptos adicionales) Los inicializadores static siguen las siguientes reglas: No
devuelven ningún valor.
Son
métodos sin nombre.
Ideal
para inicializar objetos o elementos complicados.
Permiten
gestionar excepciones con try...catch.
11. 3. Constructores (conceptos adicionales) Los inicializadores static siguen las siguientes reglas: Se
puede crear más de un inicializador static y se ejecutarán según el orden en el que se han definido.
Se
pueden utilizar para invocar métodos nativos o inicializar variables static.
A
partir de Java 1.1 existen los inicializadores de objeto utilizados en las clases anónimas y no tienen el modificador static.
11. 3. Constructores (conceptos adicionales)
11. 3. Constructores (conceptos adicionales) Desde el siguiente programa vamos a crear tres objetos de la clase testlnicializador:
11. 3. Constructores (conceptos adicionales) Este programa mostrarรก por pantalla lo siguiente:
11. 3. Constructores (conceptos adicionales) EJERCICIO: Modifica la clase UsaArbol, y aĂąade un inicializador static, en el primero crearemos los objetos Arbol1,Arbol2 , Arbol3 y Arbol4, despuĂŠs los inicializaremos, siendo cada uno de ellos independientes (Arbol3 y Arbol4 no son copias de Arbol1 y Arbol2). Finalmente, usaremos los mĂŠtodos asociados a los objetos.
11. 4. Destructores
En Java no existen los destructores
11. 4. Destructores En un intento de simplificar las cosas y mejorar la gesti贸n de memoria, es el propio sistema el que se encarga de eliminar definitivamente los objetos de la memoria cuando le asignamos el valor null a la referencia (referencia = null), le asignamos a la referencia un objeto diferente o bien termina el bloque donde est谩 definida la referencia.
11. 4. Destructores El sistema de liberación de memoria en Java se llama garbage collector (recolector de basura), este recolector trabaja de forma automática. Se le puede sugerir que se active realizando la llamada System.gc(), pero esta sola no es la única razón para que se active el recolector de basura (se activará cuando él lo decida, generalmente cuando falta memoria).
11. 4. Destructores LOS FINALIZADORES Cuando se va a liberar automรกticamente la memoria de objetos inservibles, el sistema ejecuta el finalizador de los objetos. El finalizador se caracteriza por no tener valor de retorno ni argumentos, no puede ser static y denominarse finalize().
11. 4. Destructores Un ejemplo de finalizador es el siguiente: protected void {System.out.println("Adioossss");}
finalize()
11. 4. Destructores Generalmente, los finalizadores se utilizan para liberar memoria, cerrar ficheros, conexiones, etc. Como no se sabe a ciencia cierta cuándo se van a ejecutar los finalizadores es el recolector de basura el que se encarga de ello, el consejo es que las operaciones de liberación de ciertos recursos se realicen de forma explícita (no sería recomendable cerrar una conexión de una base de datos en un finalizador).
11. 4. Destructores Como se verĂĄ mĂĄs adelante, existe una forma de sugerir a Java que ejecute el recolector de basura y es llamando al mĂŠtodo System.runFinalization() y luego al recolector de basura System.gc(). Un ejemplo de la llamada al Analizador es el siguiente:
11. 4. Destructores
11. 4. Destructores Como
se puede observar en el código se ha definido el método finalize() como protected para evitar que pueda ser invocado desde fuera de la clase.
En
el código lo que se ha hecho es crear una serie de objetos cuyo scope o ámbito está reducido a un bucle for. Una vez realizado esto hay que tener en cuenta que finalize() no se invoca cuando termina su scope (cuando termina el bucle).
11. 4. Destructores Este método se ejecutará justo antes de ejecutarse el garbage collector por lo que en nuestro código hemos tenido que forzar este hecho con las siguientes líneas: System.runFinalization(); System.gc();
Sin las anteriores líneas el programa no mostrará nada por pantalla.