You are on page 1of 23

República Bolivariana de Venezuela

Ministerio del Poder Popular para la Educación Ciencia y Tecnología


Instituto Universitario de Tecnología de Puerto Cabello

Ing. Yelmin Pérez Bachiller Wilbert Duarte


La programación orientada a objetos (POO, u OOP según sus siglas en inglés)
es un paradigma de programación que viene a innovar la forma de obtener
resultados. Los objetos manipulan los datos de entrada para la obtención de datos
de salida específicos, donde cada objeto ofrece una funcionalidad especial.
Muchos de los objetos prediseñados de los lenguajes de programación actuales
permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos
lenguajes permiten al usuario la creación de sus propias bibliotecas.
Está basada en varias técnicas,
incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsu
lamiento.
Su uso se popularizó a principios de la década de 1990. En la actualidad, existe
una gran variedad de lenguajes de programación que soportan la orientación a
objetos.
Definición de:

 OBJETOS.

Es una unidad dentro de un programa de computadores que consta de un estado


y de un comportamiento, que a su vez constan respectivamente de datos
almacenados y de tareas realizables durante el tiempo de ejecución. Un objeto
puede ser creado instanciando una clase, como ocurre en la programación
orientada a objetos, o mediante escritura directa de código y la replicación de otros
objetos, como ocurre en la programación basada en prototipos.

 CLASES

En informática, una clase es una plantilla para la creación de objetos de


datos según un modelo predefinido. Las clases se utilizan para representar
entidades o conceptos, como los sustantivos en el lenguaje. Cada clase es un
modelo que define un conjunto de variables -el estado, y métodos apropiados para
operar con dichos datos -el comportamiento. Cada objeto creado a partir de la
clase se denomina instancia de la clase.

Las clases de objetos son un pilar fundamental de la programación orientada a


objetos. Permiten abstraer los datos y sus operaciones asociadas al modo de
una caja negra. Los lenguajes de programación que soportan clases difieren
sutilmente en su soporte para diversas características relacionadas con clases. La
mayoría soportan diversas formas de herencia. Muchos lenguajes también
soportan características para proporcionar encapsulación, como especificadores
de acceso.
Una clase también puede tener una representación (metaobjeto) en tiempo de
ejecución, que proporciona apoyo en tiempo de ejecución para la manipulación de
los metadatos relacionados con la clase.

 HERENCIAS
Estos objetos interactúan unos con otros, en contraposición a la visión tradicional
en la cual un programa es una colección
de subrutinas (funciones o procedimientos), o simplemente una lista
de instrucciones para el computador. Cada objeto es capaz de recibir mensajes,
procesar datos y enviar mensajes a otros objetos de manera similar a un servicio.
Clases En programación orientada a objetos, la herencia es, después de la
agregación o composición, el mecanismo más utilizado para alcanzar algunos de
los objetivos más preciados en el desarrollo de software como lo son la
reutilización y la extensibilidad. A través de ella los diseñadores pueden crear
nuevas clases partiendo de una clase o de una jerarquía de clases preexistente
(ya comprobadas y verificadas) evitando con ello el rediseño, la modificación y
verificación de la parte ya implementada. La herencia facilita la creación de objetos
a partir de otros ya existentes e implica que una subclase obtiene todo el
comportamiento (métodos) y eventualmente los atributos (variables) de su
superclase.
Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si
declaramos una clase párrafo derivada de una clase texto, todos los métodos y
variables asociadas con la clase texto, son automáticamente heredados por la
subclase párrafo.
La herencia es uno de los mecanismos de los lenguajes de programación
orientada a objetos basados en clases, por medio del cual una clase se deriva de
otra de manera que extiende su funcionalidad. La clase de la que se hereda se
suele denominar clase base, clase padre, superclase, clase ancestro (el
vocabulario que se utiliza suele depender en gran medida del lenguaje de
programación).

 MENSAJE
En ciencias de la computación, el paso de mensajes es un paradigma
de programación ampliamente usado en el software moderno. Sus aplicaciones
cubren un amplio campo, y puede usarse desde para garantizar que los diferentes
objetos que constituyen un programa informático puedan trabajar de forma
coherente entre ellos hasta para permitir que una tarea pueda ejecutarse de forma
sincronizada entre varios ordenadores. Es uno de los conceptos clave en modelos
de programación concurrente, programación distribuida y programación orientada
a objetos.
De forma abstracta, se llama mensaje a una porción de información que un
proceso emisor envía a un destinatario (El cual puede ser otro proceso, un actor o
un objeto). El modelo de paso de mensajes es el que define los métodos y
funciones para poder llevar a cabo el envío de un mensaje de un proceso emisor a
un destinatario. Supone un enfoque opuesto al paradigma tradicional en el cual los
procesos, funciones y subrutinas sólo podían ser llamados directamente a través
de su nombre.

 POLIMORFISMO
En programación orientada a objetos, el polimorfismo se refiere a la propiedad por
la que es posible enviar mensajes sintácticamente iguales
a objetos de tiposdistintos. El único requisito que deben cumplir los objetos que se
utilizan de manera polimórfica es saber responder al mensaje que se les envía.
La apariencia del código puede ser muy diferente dependiendo del lenguaje que
se utilice, más allá de las obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta con un sistema de
tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u
objetos de cualquier clase) como Smalltalk se requiere que los objetos que se
utilizan de modo polimórfico sean parte de una jerarquía de clases.

 PACKAGE
java.lang Contiene las clases e interfaces más empleadas en la mayoría de
los programas de Java. Es importado automáticamente por todos los
programa Java: no se necesita sentencia import para utilizar lo declarado
en este paquete.
java.io Contiene clases que permiten las operaciones de entrada y salida de
datos de un programa.
java.util Contiene clases e interfaces de utilidades: operaciones con la fecha
y la hora, generación de números aleatorios...
java.applet Contiene todas las clases e interfaces necesarias para la
construcción de applets de Java
java.net Contiene clases que permite a un programa comunicarse a traves
de redes (Internet o intranet)
java.text Contiene clases e interfaces que permiten operaciones de
números, fechas, caracteres y cadenas.
java.awt Es el paquete Abstract Windowing Toolkit. Contiene muchas
clases e interfaces necesarias para trabajar con la interfaz de usuario
gráfica clásica.
java.beans Contiene clases para facilitar a los programadores la generación
de componentes de software reutilizables.

 CONSTRUCTORES

En programación orientada a objetos (POO), un constructor es una subrutina cuya


misión es inicializar un objeto de una clase. En el constructor se asignan los
valores iniciales del nuevo objeto.
Se utiliza para crear tablas de clases virtuales y poder así desarrollar
el polimorfismo, una de las herramientas de la programación orientada a objetos.
Al utilizar un constructor, el compilador determina cuál de los objetos va a
responder al mensaje (virtual) que hemos creado. Tiene un tipo de acceso, un
nombre y un paréntesis.

 CLASES ABSTRACTAS
Las clases abstractas son aquellas que por sí mismas no se pueden identificar con
algo 'concreto' (no existen como tal en el mundo real), pero sí poseen
determinadas características que son comunes en otras clases que pueden ser
creadas a partir de ellas.
Para que lo comprendas mejor, un ejemplo de clase abstracta sería una
llamada Vehículo: todos ellos realizan acciones similares (arrancar, acelerar,
frenar, etc.), pero sin embargo existen muchos tipos de vehículos diferentes y que
se comportan de forma totalmente distinta (el proceso de arrancarlos no se realiza
siguiendo los mismos pasos, unos tienen que despegar y vuelan como los
aviones, otros se sumergen para desplazarse por debajo del agua como los
submarinos, cada uno de ellos necesita ser frenado de distinto modo...).
Es decir, en el mundo real no existe un objeto 'vehículo' como tal sino que hay
diferentes tipos de vehículo, pero aunque poseen características comunes y
realizan las mismas acciones lo hacen de forma muy diferente (pudiendo además
realizar otras específicas cada uno de ellos).
Así pues, ya que una clase abstracta no representa algo concreto tampoco puede
ser instanciada (no se puede crear un Objeto a partir de ella) pero sí es posible
crear otras clases en base a su definición.

 METODOS
En la programación, un método es una subrutina cuyo código es definido en
una clase y puede pertenecer tanto a una clase, como es el caso de los métodos
de clase o estáticos, como a un objeto, como es el caso de los métodos de
instancia. Análogamente a los procedimientos en lenguajes imperativos, un
método consiste generalmente de una serie de sentencias para llevar a cabo una
acción, un juego de parámetros de entrada que regularán dicha acción o,
posiblemente, un valor de salida (o valor de retorno) de algún tipo.
La diferencia entre un procedimiento (generalmente llamado función si devuelve
un valor) y un método es que este último, al estar asociado con un objeto o clase
en particular, puede acceder y modificar los datos privados del objeto
correspondiente de forma tal que sea consistente con el comportamiento deseado
para el mismo. Así, es recomendable entender a un método no como una
secuencia de instrucciones sino como la forma en que el objeto es útil (el método
para hacer su trabajo). Por lo tanto, podemos considerar al método como el pedido
a un objeto para que realice una tarea determinada o como la vía para enviar un
mensaje al objeto y que éste reaccione acorde a dicho mensaje.

 TIPOS DE DATOS QUE MANEJA JAVA

REPRESENTACIÓN INTERNA DE LOS DATOS

En el mundo real los datos que manejamos se representan mediante letras,


números, símbolos, imágenes, sonidos, etc.
Esto se conoce como representación externa de los datos.
Pero si queremos introducirlos en un ordenador, todos estos elementos se deben
transformar ó codificar para obtener así su representación interna.
Un ordenador está compuesto fundamentalmente por circuitos electrónicos
digitales. Los datos circulan por estos circuitos en forma de impulsos eléctricos.
De forma muy simplificada podemos decir que por un circuito pasa o no pasa
corriente y esto lo podemos representar con dos dígitos: 0 y 1.
Todos los datos e información que contiene un ordenador, están representados de
forma interna mediante secuencias de ceros y unos.

Un sistema de representación que utiliza solamente dos símbolos ( 0 , 1 ) se


llama sistema binario.
Por tanto, los datos tal y como los expresamos de forma natural se deben codificar
de forma interna en binario para que puedan ser tratados por el ordenador.
El sistema binario utiliza solamente dos dígitos ( 0 y 1 ) llamados bits.
La palabra bit procede de la unión de las palabras binary digit.
Un bit es la unidad mínima de representación de información.
Utilizando 1 bit podremos solamente representar dos valores posibles: 0, 1.
Utilizando 2 bits podemos representar 4 valores: 00, 01, 10, 11.
Utilizando 3 bits podemos representar 8 valores:
000, 001, 010, 011, 100, 101, 110, 111.
Utilizando 4 bits podemos representar 16 valores:
0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111.
En general, utilizando N bits podremos representar 2N valores.
Ocho bits forman un byte.
El byte es la unidad básica de medida de la información.
Un byte es la cantidad más pequeña de información que el ordenador puede
manejar.
Con un byte se pueden representar 28 = 256 caracteres.
En el interior del ordenador los datos se transmiten y almacenan en grupos de
bytes llamados palabras.
La longitud de palabra depende de cada tipo de ordenador: 8, 16, 32, 64.

 TIPOS DE DATOS EN JAVA

Un dato siempre lleva asociado un tipo de dato, que determina el conjunto de


valores que puede tomar.
En Java toda la información que maneja un programa está representada por dos
tipos principales de datos:
 Datos de tipo básico o primitivo.
 Referencias a objetos.
Los tipos de datos básicos o primitivos no son objetos y se pueden utilizar
directamente en un programa sin necesidad de crear objetos de este tipo. La
biblioteca Java proporciona clases asociadas a estos tipos que proporcionan
métodos que facilitan su manejo.
Los tipos de datos primitivos que soporta Java son:
Tipo de Representació Tamañ Rango de Valores Valor Clase
dato n o por Asociad
(Bytes) defect a
o
byte Numérico 1 -128 a 127 0 Byte
Entero con
signo
short Numérico 2 -32768 a 32767 0 Short
Entero con
signo
int Numérico 4 -2147483648 0 Integer
Entero con a 2147483647
signo
long Numérico 8 - 0 Long
Entero con 922337203685477580
signo 8a
922337203685477580
7
float Numérico 4 ± 3.4x10- 0.0 Float
en Coma 38 a ± 3.4x1038

flotante de
precisión simple
Norma IEEE
754
double Numérico 8 ± 1.8x10- 0.0 Double
en Coma 308 a ± 1.8x10308
flotante de
precisión doble
Norma IEEE
754
char Carácter 2 \u0000 a \uFFFF \u0000 Characte
Unicode r
boolea Dato lógico - true ó false false Boolean
n
void - - - - Void

 DATOS NUMÉRICOS ENTEROS


En Java los representan los tipos: byte, short, int, long.
El tipo de dato numérico entero es un subconjunto finito de los números enteros
del mundo real. Pueden ser positivos o negativos.
Ejemplo de declaración de variables enteras:
int a;
byte n1, n2;
short x;

 DATOS NUMÉRICOS REALES


En Java los representan los tipos: float, double.
El tipo de dato numérico real es un subconjunto finito de los números reales.
Siempre llevan un punto decimal y también pueden ser positivos o negativos. Los
números reales tienen una parte entera y una parte decimal.
Por ejemplo: 0.08 -54.0001
Ejemplo de declaración de variables reales:
float peso;
double longitud;
float altura = 2.5F;
double area = 1.7E4; // equivale a 1.7 * 104
double z = .123; //si la parte entera es 0 se puede omitir

 DATOS DE TIPO CARÁCTER


En Java se representa con el tipo char.
Un dato de tipo carácter se utiliza para representar un carácter dentro del rango
\u0000 a \uFFFF (números desde 0 hasta 65535) en Unicode.
En realidad un dato de tipo char contiene un número entero dentro del rango
anterior que representa un carácter.
En Java se utiliza el código Unicode para la representación de caracteres. Este
código actualmente representa los caracteres de la mayoría de idiomas escritos en
todo el mundo.
Los 127 primeros caracteres de Unicode corresponden al código ASCII.
El Código ASCII (American Standard Code for Information Interchange o Código
Estándar Americano para el Intercambio de Información) asigna valores numéricos
a las letras, números, signos de puntuación y algunos otros caracteres especiales.
ASCII incluye 256 códigos divididos en dos conjuntos, estándar y extendido, de
128 cada uno. El conjunto ASCII básico, o estándar, utiliza 7 bits para cada
código, lo que da como resultado 128 códigos de caracteres desde 0 hasta 127.
El conjunto ASCII extendido utiliza 8 bits para cada código, dando como resultado
128 códigos adicionales, numerados desde el 128 hasta el 255.
En el conjunto de caracteres ASCII básico, los primeros 32 valores están
asignados a los códigos de control de comunicaciones y de impresora (caracteres
no imprimibles) empleados para controlar la forma en que la información es
transferida desde una computadora a otra o desde una computadora a una
impresora. En este grupo están los códigos correspondientes a la barra
espaciadora (SP por space), la tecla ENTER de retorno de carro a un nuevo
renglón (CR por carry return), etc. También existen caracteres de control usados
en teleprocesamiento, como ser ACK (Acknowledge - aviso de mensaje recibido),
BEL (bell - aviso por señal sonora), ETX (end of text – fin de texto), STX (start of
text – comienzo de texto), etc.
Los 96 códigos restantes del código básico corresponden a los caracteres
imprimibles y se asignan a los signos de puntuación corrientes, a los dígitos del 0
al 9 y a las letras mayúsculas y minúsculas del alfabeto latino.
Los códigos correspondientes al ASCII extendido, del 128 al 255, se asignan a
aquellos caracteres que no pertenecen al alfabeto anglosajón, por ejemplo, las
vocales con tilde, la ñ, y en general todos los caracteres especiales que utilizan los
distintos lenguajes.

Debido a lo limitado de su tamaño, el código ASCII no es suficiente para


representar caracteres de alfabetos como el Japonés, Chino o árabe. La solución
a este problema ha sido crear un código más grande con el que poder representar
cualquier carácter de cualquier idioma: el código Unicode.
El código UNICODE proporciona una única representación numérica para cada
símbolo, independientemente del ordenador, el programa o el lenguaje de
programación que se use.
La codificación Unicode se ha transformado en un estándar adoptado por las
principales empresas de hardware y software. Java utiliza la codificación
Unicode.
La descripción completa del estándar y las tablas de caracteres están disponibles
en la página web oficial de Unicode http://www.unicode.org/. La referencia
completa se publica, además, en forma de libro impreso cada vez que se libera
una nueva versión principal. La versión digital de este libro está disponible de
forma gratuita.
Ejemplo de declaración de variables de tipo carácter:
char car;
char letra1 = 'z';
char letra = '\u0061'; //código unicode del carácter ‘a’

 DATOS DE TIPO LÓGICO

Se representan con el tipo boolean.


Los datos de este tipo sólo pueden contener dos valores: true (verdadero) ó false
(falso).
Ejemplo de declaración de variables lógicas:
boolean primero;
boolean par = false;
Los tipos de datos lógicos son también conocidos como booleanos en honor del
matemático inglés George Bool, que desarrolló la teoría conocida como álgebra de
bool que fue la base para la representación de los circuitos lógicos.

OPERADORES
Un operador lleva a cabo operaciones sobre uno (operador unario), dos
(operador binario) o tres (operador ternario) datos u operandos de tipo primitvo
devolviendo un valor determinado también de un tipo primitivo. El tipo de valor
devuelto tras la evaluación depende del operador y del tipo de los operandos. Por
ejemplo, los operadores aritméticos trabajan con operandos numéricos, llevan a
cabo operaciones aritméticas básicas y devuelven el valor numérico
correspondiente. Los operadores se pueden clasificar en distintos grupos según se
muestra en los siguientes apartados.

4.1 OPERADOR ASIGNACIÓN


El operador asignación =, es un operador binario que asigna el valor del término
de la derecha al operando de la izquierda. El operando de la izquierda suele ser el
identificador de una variable. El término de la derecha es, en general, una
expresión de un tipo de dato compatible; en particular puede ser una constante u
otra variable. Como caso particular, y a diferencia de los demás operadores, este
operador no se evalúa devolviendo un determinado valor.
Figura 4.1 Operador asignación

No debe confundirse el operador asignación (=) con el operador relacional de


igualdad (==) que se verá más adelante. Además Java dispone de otros
operadores que combinan la asignación con otras operaciones (operadores
aritméticos combinados).

En el siguiente código se muestran algunos ejemplos de uso del operador


asignación con datos de distintos tipos:

public class OpAsignacion {


public static void main(String[] args) {

int i,j;

double x;

char c;

boolean b;

String s;

i = 15;

j = i;

x = 12.345;

c = 'A';

b = false;

s = "Hola";

System.out.println("i = " + i);

System.out.println("j = " + j);

System.out.println("x = " + x);

System.out.println("c = " + c);


System.out.println("b = " + b);

System.out.println("s = " + s);

Salida por pantalla del programa anterior:

$>javac OpAsignacion.java

$>java OpAsignacion

i = 15


j = 15


x = 12.345

c = A


b = false

s = Hola

4.2 OPERADORES ARITMÉTICOS


El lenguaje de programación Java tiene varios operadores aritméticos para los
datos numéricos enteros y reales. En la siguiente tabla se resumen los diferentes
operadores de esta categoría.
Figura 4.2 Operadores aritméticos básicos

El resultado exacto depende de los tipos de operando involucrados. Es


conveniente tener en cuenta las siguientes peculiaridades:

 El resultado es de tipo long si, al menos, uno de los operandos es de tipo long y
ninguno es real (float o double).
 El resultado es de tipo int si ninguno de los operandos es de tipo long y tampoco
es real (float o double).
 El resultado es de tipo double si, al menos, uno de los operandos es de
tipo double.
 El resultado es de tipo float si, al menos, uno de los operandos es de tipo float y

 ninguno es double.
 El formato empleado para la representación de datos enteros es el
complemento a dos. En la aritmética entera no se producen nunca
desbordamientos (overflow) aunque el resultado sobrepase el intervalo de
representación (int o long).
 La división entera se trunca hacia 0. La división o el resto de dividir por cero es
una operación válida que genera una excepción ArithmeticException que puede
dar lugar a un error de ejecución y la consiguiente interrupción de la ejecución
del programa.
 La aritmética real (en coma flotante) puede desbordar al infinito (demasiado
grande, overflow) o hacia cero (demasiado pequeño, underflow).
 El resultado de una expresión inválida, por ejemplo, dividir infinito por infinito, no
genera una excepción ni un error de ejecución: es un valor NaN (Not a Number).

4.3 OPERADORES ARITMÉTICOS INCREMENTALES


Los operadores aritméticos incrementales son operadores unarios (un único
operando). El operando puede ser numérico o de tipo char y el resultado es del
mismo tipo que el operando. Estos operadores pueden emplearse de dos formas
dependiendo de su posición con respecto al operando.
Figura 4.3 Operadores aritméticos incrementales

Estos operadores suelen sustituir a veces al operador asignación y también suelen


aparecer en bucles for.

4.4 OPERADORES ARITMÉTICOS COMBINADOS


Combinan un operador aritmético con el operador asignación. Como en el caso de
los operadores aritméticos pueden tener operandos numéricos enteros o reales y
el tipo específico de resultado numérico dependerá del tipo de éstos. En la
siguiente tabla se resumen los diferentes operadores de esta categoría.

Figura 4.4 Operadores aritméticos combinados

4.5 OPERADORES DE RELACIÓN


Realizan comparaciones entre datos compatibles de tipos primitivos (numéricos,
carácter y booleanos) teniendo siempre un resultado booleano. Los operandos
booleanos sólo pueden emplear los operadores de igualdad y desigualdad.

Figura 4.5 Operadores de relación

Todos los valores numéricos que se comparan con NaN dan como
resultado false excepto el operador != que devuelve true. Esto ocurre incluso si
ambos valores son NaN.
4.6 OPERADORES LÓGICOS O BOOLEANOS
Realizan operaciones sobre datos booleanos y tienen como resultado un valor
booleano. En la siguiente tabla se resumen los diferentes operadores de esta
categoría.

Figura 4.6 Operadores booleanos

Para mejorar el rendimiento de ejecución del código es recomendable emplear en


las expresiones booleanas el operador && en lugar del operador &. En este caso
es conveniente situar la condición más propensa a ser falsa en el término de la
izquierda. Esta técnica puede reducir el tiempo de ejecución del programa. De
forma equivalente es preferible emplear el operador || al operador |. En este caso
es conveniente colocar la condición más propensa a ser verdadera en el término
de la izquierda.

4.7 EL OPERADOR CONDICIONAL


Este operador ternario tomado de C/C++ permite devolver valores en función de
una expresión lógica. Sintaxis:

expresionLogica ? expresion_1 : expresion_2

Si el resultado de evaluar la expresión lógica es verdadero, devuelve el valor de la


primera expresión, y en caso contrario, devuelve el valor de la segunda expresión.
Figura 4.7 Operador condicional

La sentencia de asignación:

valor = (expresionLogica ? expresion_1 : expresion_2);`

como se verá más adelante es equivalente a:

if (expresionLogica)

valor = expresion_1;

else

valor = expresion_2

4.8 OPERADORES DE BIT


Tienen operandos de tipo entero (o char) y un resultado de tipo entero. Realizan
operaciones con dígitos (ceros y unos) de la representación binaria de los
operandos. Exceptuando al operador negación, los demás operadores son
binarios. En la siguiente tabla se resumen los diferentes operadores de esta
categoría

Figura 4.8 Operadores de bit

4.9 OPERADOR CONCATENACIÓN DE CADENAS


El operador concatenación +, es un operador binario que devuelve una cadena
resultado de concatenar las dos cadenas que actúan como operandos. Si sólo uno
de los operandos es de tipo cadena, el otro operando se convierte implícitamente
en tipo cadena.

Figura 4.9 Operador concatenación

4.10 SEPARADORES
Existen algunos caracteres que tienen un significado especial en el lenguaje Java.
En la siguiente tabla se resumen los diferentes separadores que pueden
encontrarse en el código fuente de un programa.
Figura 4.10 Separadores en Java

4.11 EXPRESIONES
Una expresión es una combinación de operadores y operandos que se evalúa
generándose un único resultado de un tipo determinado.

4.12 PRIORIDAD ENTRE OPERADORES


Si dos operadores se encuentran en la misma expresión, el orden en el que se
evalúan puede determinar el valor de la expresión. En la siguiente tabla se
muestra el orden o prioridad en el que se ejecutan los operadores que se
encuentren en la misma sentencia. Los operadores de la misma prioridad se
evalúan de izquierda a derecha dentro de la expresión.
Figura 4.11 Prioridad de los operadores
 PROECEDENCIA DE OPERADORES

 Civilizadamente se organizan de acuerdo al nivel del precedencia de cada


uno. Primeramente proceden los unarios, luego los aritméticos, después los
de bits, posteriormente los relacionales, detrás vienen los booleanos y por
último el operador de asignación. La regla de precedencia establece que los
operadores de mayor nivel se ejecuten primero.
Precedencia de operadores

Descripción Operadores

operadores posfijos op++ op--

operadores unarios ++op --op +op -op ~ !

multiplicación y división */%

suma y resta +-

desplazamiento << >> >>>

operadores relacionales < > <= =>

equivalencia == !=

operador AND &

operador XOR ^

operador OR |

AND booleano &&

OR booleano ||

condicional ?:
operadores de asignación = += -= *= /= %= &= ^= |= <<= >>= >>>=

 En la tabla se muestra el nivel de precedencia de los operadores. Los de


mayor nivel se encuentran arriba. Podemos ver que los últimos son los de
asignación. Esto es lógico, ya que se debe calcular primeramente la
expresión antes de asignar un resultado a una variable.
 Veamos unos ejemplos de cómo actúa esta regla.

 int j = 1 + 3 * 4; // resultado j = 13

 Desde que aprendimos aritmética básica, conocemos la regla que nos


obliga a calcular la multiplicación antes de una suma. Esto también se
cumple en Java.

 int j = 1 + 3 – 4; resultado j= 0;

 Si todos los operadores tienen un nivel idéntico de precedencia se evalua la


expresión de izquierda a derecha.

 Utilización de paréntesis
 Se utilizan para aislar una porción de la expresión de forma que el cálculo
se ejecute de forma independiente. Puede forzar a una expresión a ignorar
las reglas de precedencia.

 int j = 1 + 3 * 4; // resultado j = 13
 int h = (1 + 3) * 4 // resultado h = 16

 Tomando el primer ejemplo, forzamos al compilador a realizar la suma


antes que la multiplicación.
 En este ejemplo es imprescindible la utilización de paréntesis :

 int k = 1 + (h = 3);

 Si quitamos los paréntesis el compilador protestará. Porque al establecer un


nivel muy bajo para la asignación, procede primero la suma. Pero estamos
sumando con una variable sin valor.
 Como en matemáticas, podemos anidar los paréntesis. Se comenzara a
evaluar los internos hasta llegar a los externos.
 Cabe agregar que los paréntesis no disminuyen el rendimiento de los
programas. Por lo tanto, agregar paréntesis no afecta negativamente al
programa.

 int k = ((12 - 2) * ( 21 - 11)) / ((1+1)*(15-10)) + 1 ;

 RECOLECTOR DE BASURA

Recolección de basura informática. El espacio de memoria se va llenando con


diferentes "objetos" (representados con colores), también pueden destruirse
algunos de ellos, dejando "huecos" en el espacio de memoria. Cuando ya no
queda espacio disponible, o cuando lo decide la rutina de recolección de basura,
la memoria es "compactada", colocando todos los "objetos" que se están usando
al principio, y consolidando todos los "huecos" de memoria al final, quedando así
una gran área de memoria disponible para la futura creación de objetos.

Un recolector de basura (del inglés garbage collector) es un mecanismo implícito


de gestión de memoria implementado en algunos lenguajes de programación de
tipo interpretado o semiinterpretado.

 FUNCIONAMIENTO DEL RECOLECTOR DE BASURA


Cuando un lenguaje dispone de recolección de basura, el programador no tiene que invocar a
una subrutina para liberar memoria. La reserva de memoria también es más o menos
automática sin la intervención del programador. Por ejemplo:

 En los lenguajes orientados a objetos: se reserva memoria cada vez que el programador
crea un objeto, pero éste no tiene que saber cuánta memoria se reserva ni cómo se hace
esto.
 En los lenguajes declarativos: cada vez que se construye una expresión se reserva
memoria (de una manera inteligente), pero el programador no es consciente de ello.
Cuando se compila el programa, automáticamente se incluye en éste
una subrutina correspondiente al recolector de basura. Esta subrutina también es invocada
periódicamente sin la intervención del programador.
El recolector de basura es informado de todas las reservas de memoria que se producen en el
programa. Además, el compilador colabora para que sea posible llevar una cuenta de todas
las referencias que existen a un determinado espacio de memoria reservado.
Cuando se invoca el recolector de basura, recorre la lista de espacios reservados observando
el contador de referencias de cada espacio. Si un contador ha llegado a cero significa que ese
espacio de memoria ya no se usa y, por tanto, puede ser liberado.
Naturalmente, este proceso consume un cierto tiempo en el que no se hace nada
verdaderamente útil para el propósito del programa. Por tanto, no puede ser invocado con
demasiada frecuencia.
En consecuencia, el único inconveniente a este mecanismo es determinar cuándo se tiene
que ejecutar el recolector de basura. Existen varios algoritmos para hacerlo, pero el más
eficiente es el primero de ellos:

 Esperar a que no quede memoria libre, y entonces, ejecutar el recolector de basura.


 Fijar un umbral de ocupación de la memoria libre y ejecutar el recolector de basura
cuando se supere dicho umbral.
 Ejecutar el recolector de basura a intervalos regulares (no siempre es posible).
 Ejecutar el recolector de basura justo antes de cada reserva de memoria.
 Permitir al programador que invoque explícitamente al recolector de basura cuando
quiera.

 FINALIZADORES EN JAVA

Los finalizadores son métodos que vienen a completar la labor del garbage
collector. Un finalizador es un método que se llama automáticamente cuando se
va a destruir un objeto (antes de que la memoria sea liberada de modo automático
por el sistema).
Se utilizan para ciertas operaciones de terminación distintas de liberar
memoria (por ejemplo: cerrar ficheros, cerrar conexiones de red, liberar memoria
reservada por funciones nativas, etc.).
Hay que tener en cuenta que el garbage collector sólo libera la memoria reservada
con new. Si por ejemplo se ha reservado memoria con funciones nativas en C (por
ejemplo, utilizando la función malloc()), esta memoria hay que liberarla
explícitamente utilizando el método finalize().
Un finalizador es un método de objeto (no static), sin valor de retorno (void), sin
argumentos y que siempre se llama finalize(). Los finalizadores se llaman de modo
automático siempre que hayan sido definidos por el programador de la clase. Para
realizar su tarea correctamente, un finalizador debería terminar siempre llamando
al finalizador de su super-clase.

Tampoco se puede saber el momento preciso en que los finalizadores van a ser
llamados. En muchas ocasiones será conveniente que el programador realice
esas operaciones de finalización de modo explícito mediante otros métodos que él
mismo llame.

El método System.runFinalization() “sugiere” a la JVM que ejecute los


finalizadores de los objetos pendientes (que han perdido la referencia). Parece ser
que para que este método se ejecute, en Java 1.1 hay que llamar primero a gc() y
luego a runFinalization().