You are on page 1of 65

Clase 2. Introducción a la programación orientada a objetos.

Previo a la programacion orientada a objetos, se conocia la programacion

estructurada.

Programación estructurada.

Es un estilo de programacion con el cual se elaboran programas cuya

estructura es la mas clara posible, mediante el uso de tres estructuras basicas de

control logico, a saber:

o SECUENCIA.

o SELECCION.

o ITERACION.

Beneficios:

Los programas son mas faciles de entender, ya que pueden ser leidos de

forma secuencial

Reduccion de los costes de mantenimiento de los programas

Programas mas sencillos y mas rapidos (ya que es mas facil su

optimizacion)
Inconvenientes:

El principal inconveniente de este metodo de programacion es que se obtiene un

unico bloque de programa, que cuando se hace demasiado grande puede resultar

problematico su manejo; esto se resuelve empleando la programacion modular,

definiendo modulos interdependientes programados y compilados por separado.

Debido al gran inconveniente que posee la programacion estructurada a la hora de

desarrollar sistemas gigantes, empiezan a surgir nuevas formas de programar y

entre estas tenemos a la Programacion Orientada a Objetos (POO).

¿Qué es la programación orientada a objetos?

La P.O.O. es lo que se conoce como un paradigma o modelo de programacion.

Esto significa que no es un lenguaje especifico, o una tecnologia, sino una forma

de programar, una manera de plantearse la programacion.

Es un paradigma de programacion que usa objetos y sus interacciones para

disenar aplicaciones y programas de computadora.

No es la unica (o necesariamente mejor o peor que otras), pero se ha

constituido en una de las formas de programar mas populares e incluso muchos

de los lenguajes que usamos hoy dia lo soportan o estan disenados bajo ese

modelo (PHP, ActionScript, Java, C++, entre otros).

Lo que caracteriza a la POO es que intenta llevar al mundo del codigo lo

mismo que encontramos en El Mundo Real. Cuando miramos a nuestro alrededor

.que vemos? pues, cosas, objetos, pero podemos reconocer estos objetos porque
cada objeto pertenece a una clase, eso nos permite distinguir, por ejemplo, un

perro de un auto (porque son de clases diferentes) y tambien un TV de otro

(porque, aunque sean iguales, cada uno es un objeto distinto). Este es el modelo

que la POO intenta seguir para estructurar un sistema.

Java

Que es Java?

Java es una tecnologia completa nacida en mayo de 1996 que consta de un

lenguaje de programacion orientado a objetos desarrollado en los laboratorios de

Sun Microsystems a principios de los 90, un sistema de despliegue, un conjunto

de herramientas de soporte y herramientas de creacion y compilacion.

A diferencia de los lenguajes de programacion convencionales, que generalmente

estan disenados para ser compilados a codigo nativo, Java es compilado a codigo

intermedio interpretado por una maquina virtual Java denominado bytecode

(usando normalmente un compilador JIT) lo que le permite ser compilado una sola

vez y ejecutado en cualquier maquina, con cualquier sistema operativo, mientras

exista una maquina virtual compatible.

El lenguaje en si mismo toma mucha de su sintaxis y semantica de C y Smalltalk,

pero tiene un modelo de objetos mucho mas simple y elimina herramientas de bajo

nivel como punteros.

Java esta solo lejanamente emparentado con JavaScript, aunque tengan nombres

similares y compartan una sintaxis al estilo de C algo parecida. En definitiva,


JavaScript solo tiene de Java las cuatro primeras letras.

Luego, para poder ejecutar nuestra aplicacion Java solo necesitamos de la

existencia de dicha maquina virtual. La arquitectura puede ser vista en el siguiente

grafico:

Aplicación Java

Librerías

Java Virtual Machine

Sistema Operativo

Hardware

Definiciones:

1. Clase: descripcion de un grupo de entidades con caracteristicas similares.

Ej:

public class Perro{}

Sintaxis básica de declaración de una clase en java:

<modificadores> class <nombre_clase> {

[<Atributos>]

[<Constructor>]

[<Metodos>]

2. Objeto: instancia de una clase. Creacion unica a partir del plano o clase, con
atributos independientes.

Ej:

Perro miPerro = new Perro();

3. Miembros de clase: se entiende por miembros de clase a los atributos y

metodos que conforman la clase.

Ej:

public class Perro

//Atributos

String nombre;

int patas = 4;

//Metodos

public void ladrar(){

System.out.println(͞guau!͟);

Atributo: Representa el estado.

Sintaxis básica de declaración de un atributo en java:

[<modificadores>] <tipo><name> [ = valor_inicial] ;

Metodo: Representa el comportamiento.

Sintaxis básica de declaración de métodos en java:

[<modificadores>] <tirpo_de_retorno><name> ([<parametros>]) {

[<codigo>]

}
4. Constructor: estructura dentro de la definicion de clase que permite instanciarla

Ej:

public class Perro{

String nombre;

int patas = 4;

public void ladrar(){

System.out.println(͞guau!͟);

public Perro(String n){

nombre = n;

Sintaxis básica de declaración de un constructor en java:

[<modificadores>] class <name> ([<parametros>]) {

[<codigo de inicializacion>]

5. Abstracción: descartar los detalles. La abstraccion se puede dar a varios

niveles:

En atributos: descartar los tipos de datos y modificadores.


En metodos: descartar los tipos de datos, parametros, funcionalidad,modificadores y tipos de
retorno.

En clases: descartar los miembros de la clase.

En paquetes: descartar las clases que conforman al paquete para su visualizacion global.

6. Herencia: proceso por el cual una clase hija obtiene los miembros de otra clase

padre

Ej:

public class Mamifero{

String nombre;

public class Perro extends Mamifero{

//el atributo ͞nombre͟ es heredado de la clase Mamifero

int patas = 4;

public void ladrar(){

System.out.println(͞guau!͟);

public Perro(String n){

nombre = n;

}
J. Polimorfismo: posibilidad de los objetos en comportarse como definidos por

multiples clases. Por ejemplo, un objeto ͞pastor aleman͟ se puede comportar como

un ͞Perro͟ o como un ͞Mamifero͟

Ej:

Perro miPerro = new Perro();

Mamifero miMamifero = miPerro(); //todo perro es un Mamifero

//lo siguiente no compila porque todo Perro es un Mamifero,

//pero no todo Mamifero es un Perro.

Perro miPerro2 = new Mamifero();

8. Sobrecarga: una clase con definiciones de multiples metodos o constructores

con nombres iguales y con conjuntos de parametros diferentes. Ejemplo, println().

Ej:

public class Perro extends Mamifero{

//...

//Sobrecarga de metodos

public void comer(String comida){

System.out.println(͞Estoy comiendo ͞ + comida);

public void comer(String comida, String bebida){

comer(comida);

System.out.println(͞ y estoy bebiendo ͞ + bebida);

//Sobrecarga de constructores

public Perro(String n){


nombre = n;

public Perro(){

nombre = ͞Bobby͟;

9. Sobreescritura: hacer mas especifico un metodo de una clase padre en una

clase hija. Las condiciones para que el metodo sea sobreescrito son:

Debe tener el mismo nombre del metodo original

Debe tener el mismo conjunto y orden de parametros

Debe retornar el mismo tipo de datos

Debe arrojar las mismas excepciones o excepciones hijas de la original

El modificador de acceso no puede ser mas restrictivo que el original

Ej:

public class Mamifero{

//...

public void setNombre(String n){

nombre = n;

public class Perro extends Mamifero{

//...

Lenguajes de programación II

public void setNombre(String n){


System.out.print

(͞Se ha modificado el nombre del perro ͞ +

nombre = n;

System.out.println(͞ al nuevo nombre͟ + nombre);

//...

10. Asociación: relacion entre dos clases o mas

11. Agregación: particularidad de la asociacion donde tanto el elemento

contenedor como alguno de los elementos

enlazados. Ejemplo: la cocina (como espacio fisico) y los artefactos de cocina

(horno, micro-ondas, etc.). Si

cocina. Si no existe ningun

tendriamos cuatro paredes y se

12.Composición: particularidad de la agregacion donde tanto el elemento

contenedor como todos los elementos contenidos deben existir y estar enlazados.

Ejemplo: un tubo de madera es simplemente un tubo de madera. Una mina de

grafito es simplemente una mina de grafito. Juntos forman un lapiz. La ausencia

de alguno de estos elementos hace que deje de existir el lapiz.


nombre);

: : contenidos deben existir y estar

no existe el espacio fisico, se pierde el concepto de

artefacto de cocina en el espacio fisico, simplemente

pierde con esto tambien el concepto de cocina

: io

13.Recolección de basura

de ejecucion denominado Recolector de Basura (GC) se encarga de liberar la

memoria que no esta siendo utilizada. Est

enfoque en lo que realmente debe programar, en lugar de preoc

de vida, tarea que realiza la JVM.

14.Manejo de memoria: en Java existen dos regiones de memoria; el stack y el

heap.

Stack: es el encargado de almacenar las variables que pertenezcan a alguno de

los ocho tipos basicos de datos.

Heap: es la region de memoria encargada de almacenar los objetos.

De esta forma si escribimos el siguiente codigo:

int i = 1;

Perro miPerro = new Perro();

En memoria es visto como:

Observe que las variables que apuntan a los objetos en la memoria


almacenan la direccion de memoria del objeto, un entero en formato hexadecimal.

Por lo tanto estas variables tambien se encuentran en el stack, donde pertenecen

los ocho tipos basicos de datos.

Perro miPerro = 1J;

Ya que el compilador se entera que los tipos son incompatibles, Perro e int.

Tipos basicos de datos

Java posee ocho tipos basicos de datos

Ing. Erick Andrade- 2010

basura: tecnica utilizada por la tecnologia Java donde un hilo

Esto permite que el programador se

preocuparse por el ciclo

: ap: La siguiente sentencia es ilegal:

o uparse realmente

Lenguajes de programación II

Ing. Erick Andrade- 2010

This y Super

Sentencia ͞this͟: la palabra reservada ͞this͟ es usada para referirse al mismo

objeto y poder acceder exactamente a los miembros que lo conforman.

Ej:

public class Mamifero{

String nombre;

public void setNombre(String nombre){

this.nombre = nombre;

Sentencia ͞super͟: la palabra reservada ͞super͟ es usada para referirse a la


clase padre y sus miembros, desde una clase mas especializada en el arbol de

herencia.

Ej:

public class Mamifero{

String nombre;

public void setNombre(String nombre){

this.nombre = nombre;

public class Perro extends Mamifero{

//...

public void setNombre(String n){

System.out.print(͞Se ha modificado el nombre del perro ͞ + nombre);

nombre = n;

System.out.println(͞ al nuevo nombre͟ + nombre);

//...

public void llamarAlPadre(){

//Llamar al metodo ͞setNombre͟ como lo hace el padre

super.setNombre(String nombre);

Modificadores de acceso

En Java existen cuatro modificadores de acceso con los siguientes permisos a


miembros, constructores y clases

Manejo de paquetes

Sentencia package: la palabra reservada

maquina virtual la carpeta a la cual pertenece dicha clase.

Ej:

//declarar el paquete al que pertenece la clase

package com.celti.domain;

public class Mamifero{

String nombre;

public void setNombre(String

this.nombre = nombre;

La distribucion de los archivos en disco se ve de esta forma:

clases.

: ͞package͟ le informa a la clase y a la

nombre){

Sentencia import: la palabra reservada import permite hacer uso de clases que

se encuentran en un paquete distinto al declarado en la clase.


Ej:

package com.uni.domain;

//buscar las declaraciones de las clases que hagan falta

import com.uni.domain.Mamifero;

import java.awt.*;

public class Escritor{

public static void main (String[] args){

Mamifero miMamifero = new Mamifero();

Frame f = new Frame();

f.setVisible(true);

Miembros de clase

Sentencia static: la palabra reservada static nos indica que un miembro (metodo

o atributo) pertenece a la clase, en lugar de pertenecer a un objeto en particular.

En consecuencia un miembro estatico puede ser accedido sin la necesidad de

instanciar la clase para su uso. Un buen ejemplo de este uso es la clase

java.lang.Math, donde todos sus miembros son estaticos. La idea de Math es

proporcionar el valor del numero PI, metodos como el calculo del seno, coseno y

tangente (entre otros) sin necesidad de crear un objeto para ello. De no ser asi,

entonces deberiamos instanciar un objeto a partir de la clase Math cada vez que

deseamos hacer una operacion matematica medianamente compleja.

Ej:
public class Calculador{

public static void main (String[] args){

double radio = 4;

double longitud = 2*Math.PI*radio;

double area = Math.PI*Math.pow(radio,2);

System.out.println(͞La longitud de la circunferencia es de ͞+ longitud +͞ y el area es de ͞ + area);

Por otro lado se debe tomar en cuenta que si un miembro pertenece a la clase (en

otras palabras, que es estatico), el valor de los atributos sera almacenado en la

clase y no en un objeto especifico. Por ello cuando vemos el siguiente codigo:

public class Perro{

public static String nombre;

e instanciamos tres objetos del tipo Perro y modificamos sus nombres:

Perro p1 = new Perro();

Perro p2 = new Perro();

Perro p3 = new Perro();

p1.nombre = ͞Bob͟;

p2.nombre = ͞Chip͟;
p3.nombre = ͞Speedy͟;

al imprimir dichos valores en el terminal obtenemos siempre el ultimo valor

agregado:

System.out.println(p1.nombre);

System.out.println(p2.nombre);

System.out.println(p3.nombre);

//La respuesta a esta ejecucion es:

// Speedy

// Speedy

// Speedy

Esto se debe a que estamos almacenando el valor en la misma casilla, en la clase,

en lugar de almacenarla en un objeto en particular.

Constantes

Sentencia final: la palabra reservada final define distintas acciones dependiendo

de donde se coloque este modificador:

En la clase: final indica que la clase no puede ser heredada

Ej:

public final class Perro{

//...

}
En un metodo: final indica que el metodo no puede ser sobreescrito

Ej:

public final void depositar(double cantidad, long cuenta);

En un atributo: indica que el atributo es constante y una vez reciba el primer valor

a tiempo de ejecucion, el mismo no podra ser alterado

Ej:

public final int numeroDeCedula;

Los constructores no pueden ser final.


Clase 3. Elementos de un programa Java

Comentarios en Java.

Existen tres tipos de come tarios definidos para Java:

// Comentarios de una línea

/* Comentario de una o más líneas*/

/** Comentario de documentación*/

Declaraciones, bloques y espacios en blanco.

Una declaración es una o más líneas de código terminadas por un punto y coma

(;). Ejemplo:

totales = a + b + c + d + e + f;
lo cual es equivalente a:

totales = a + b + c +

d + e + f;

Un bloque es una colección de declaraciones limitadas por llaves que abren y

cierran { }. Ejemplo:

x = y + 1;

y = x +1;

En java, un espacio, tabulador o línea nueva son espacios en blanco. Un

programa podría ser escrito completamente en una sola línea y en contraste,

cualquier cantidad de espacios en blanco está permitido en un programa Java. La

finalidad de estos espacios es mejorar la legibilidad del código fuente. (identación).

Identificadores.

Los identificadores son usados para dar nombre a las clases, los métodos y los

atributos o variables. Un identificador puede ser cualquier secuencia descriptiva de

letras mayúsculas o minúsculas, números, caracteres de subrayado (_) o el

símbolo del dólar $. Un identificador nunca puede empezar con un número para

evitar la confusión con un literal numérico. Es importante también recordar que

Java es un lenguaje ͞case-sensitive͟ es decir, que distingue entre mayúsculas y

minúsculas en un texto, así, el identificador TOTAL no es equivalente al

identificador total. Entre algunos identificadores válidos tenemos los siguientes:


PruebaInicial suma a5 $cantidad numero_de_casa

No son válidos los siguientes nombres para un identificador:

5a Prueba-Inicial numero/casa

Normas:

Existe una serie de normas recomendadas para crear identificadores en Java:

Es muy habitual escribir todos los identificadores en minúscula teniendo en cuenta

las siguientes excepciones:

1. Si en un identificador queremos incluir un nombre compuesto se pone el primer

nombre entero en minúscula y el resto con la primera letra en mayúscula y el resto

en minúscula.

Por ejemplo:

miEdadActual = 18;

2. Los identificadores de clases e interfaces siempre empiezan en mayúscula

siguiendo la anterior norma en caso de tratarse de un nombre compuesto. Por

ejemplo:

MiPrimerPrograma();

3. Los nombres de variables finales (habitualmente llamadas "constantes") se

escriben íntegramente en mayúscula. Por ejemplo: "PI", ͞E͟


Otra restricción muy importante y evidente a la hora de elegir identificador por

ejemplo para una variable es no coincidir con ciertas palabras restringidas que

tiene el lenguaje.

Literales

Un valor constante en Java se crea a partir de una representación literal. Por

ejemplo:

500 6J.8 ͚F͛ ͞Buenos días͟

De izquierda a derecha, el primer literal especifica un entero, el segundo, un valor

en coma flotante, el tercero un caracter constante y el último una cadena de

caracteres.

Variables y constantes

Variables miembro

Una clase en Java puede contener variables y métodos. Las variables pueden ser

tipos primitivos como byte, int, char, etc.

Por ejemplo, en el siguiente código podemos observarlo:

public class Numero {

int i;

public Numero() {

i = 10;

public void suma( int j ) {

int suma;

suma = i + j;
}

La clase Numero contiene una variable (i) y dos métodos, Numero() que es el

constructor de la clase y suma( int j ).

La declaración de una variable miembro aparece dentro del cuerpo de la clase,

pero fuera del cuerpo de cualquier método de esa clase. Si se declara dentro de

un método, será una variable local del método y no una variable miembro de la

clase.

Ámbito de una variable

Para delimitar los bloques de sentencias compuestas en Java se usan dos llaves

{}. Las variables sólo son válidas desde el punto donde están declaradas hasta el

final de la sentencia compuesta que la engloba. Se podrían anidar estas

sentencias compuestas, y cada una puede contener su propio conjunto de

declaraciones de variables locales pero no se puede declarar una variable con el

mismo nombre que una de ámbito exterior.

En el siguiente ejemplo se intenta declarar dos variables separadas con el mismo

nombre:

class AmbitoVariable {

double a = 1; // ámbito exterior

{ // crea un nuevo ámbito

double a = 2; // error de compilación


}

Variables de Instancia

La declaración de una variable miembro dentro de la definición de una clase

sin anteponerle la palabra clave static, hace que sea una variable de instancia en

todos los objetos de la clase. El significado de variable de instancia sería, más o

menos, que cualquier objeto instanciado de esa clase contiene su propia copia de

toda variable de instancia, es decir, como un objeto es una instancia de una clase,

y como cada objeto tiene su propia copia de un dato miembro particular de la

clase, entonces se puede denominar a ese dato miembro como variable de

instancia.

En Java, se accede a las variables de instancia asociadas a un objeto

determinado utilizando el nombre del objeto, el operador punto (.) y el nombre de

la variable.

Ejemplo:

objeto.laVariableDeInstancia;

Variables Estáticas

Cuando se usa la palabra reservada static para la declaración de un dato

miembro de una clase, se crea una variable de clase o variable estática de la


clase. El significado de variable estática es que todas las instancias de la clase

contienen las mismas variables de clase o estáticas. En otras palabras, en un

momento determinado se puede querer crear una clase en la que el valor de una

variable de instancia sea el mismo (y de hecho sea la misma variable) para todos

los objetos instanciados a partir de esa clase. Es decir, que exista una única copia

de la variable de instancia, entonces es cuando debe usarse la palabra clave

static.

class Documento extends Pagina {

static int version = 10;

El valor de la variable version será el mismo para cualquier objeto instanciado de

la clase Documento. Siempre que un objeto instanciado de Documento cambie la

variable version, ésta cambiará para todos los objetos.

Constantes

En Java, la palabra clave final se utiliza para indicar que una variable debe

comportarse como si fuese constante, esto significa que no se permite su

modificación una vez que haya sido declarada e inicializada.

Como es una constante, se le ha de proporcionar un valor en el momento en que

se declare, por ejemplo:

class Circulo {

final float PI = 3.14159;

...
}

Si se intenta modificar el valor de una variable final desde el código de la

aplicación, se generará un error de compilación.

Si se usa la palabra clave final con una variable o clase estática, se pueden crear

constantes de clase, haciendo de esto modo un uso altamente eficiente de la

memoria, porque no se necesitarían múltiples copias de las constantes.

La palabra clave final también se puede aplicar a métodos, significando en este

caso que los métodos no pueden ser sobreescritos.

¿Cómo almacenar datos en una variable?

El trabajo con datos es parte fundamental de cualquier programa, las variables y

sus tipos se encargan de almacenar esa información y la memoria que es

necesaria para gestionarlas.

La manera mas habitual de declarar una variable siempre contiene dos elementos,

el tipo de la variable y su nombre y terminando la declaración con punto y coma.

También se puede declarar en una misma instrucción mas de una variable del

mismo tipo, separadas por una coma, al igual que se puede inicializar una

variable en el momento de declararla.

Inicializar una variable consiste en almacenar un determinado valor en el espacio

de memoria reservado para ella.

int valor;

int valor1 = 3, valor2 = 6,valor3 = 5;


Lenguajes de programación II

Tipos de variable

Las variables en Java deben tener un tipo de dato asociado. El tipo de dato de esa

variable indicara los valores que la variable puede contener y las operaciones que

se pueden realizar con ella. Podemos diferenciar los datos en Java en dos

categorías de datos principales: los tipos primitivos y los tipos referenciados.

Los tipos primitivos contienen un sólo valor e incluyen los tipos como los enteros,

coma flotante, los caracteres, de tipo booleano etc...

Tipos primitivos:

Logicos: boolean

Textual: char

Enteros: byte, short, int, long

Flotantes: double y float

Los tipos de datos lógico poseen dos literales: true y false y se inicializa con el

valor false;
Los tipos de datos textual deben poseer su valor encerrado en comillas simples ͚ ͛

y se inicializa con ͚\u0000͛

Los tipos de dato enteros poseen tres formas: decimal (9), octal (0JJ) y

hexadecimal (0XBAAC). Generalmente se inicializan con el valor cero.

Los tipos de dato flotante incluyen un punto en su valor para indicar que son

números decimales. También pueden contener E, F y D para expresar que se

trata de un valor exponencial, un valor float y un valor double respectivamente.

Tipos referenciados

Más allá de los tipos de datos primitivos, tenemos los tipos de datos referenciados.

Una variable de referencia contiene el manejador o apuntador a un objeto.

Los tipos referenciados se llaman así porque el valor de una variable de referencia

es una referencia (un puntero) hacia el valor real. En Java tenemos los arrays, las

clases y las interfaces como tipos de datos referenciados.

public class MiFechaDeNacimiento {

private int dia = 1 ;

private int mes = 10;

private int ano = 2000;

public MiFechaDeNacimiento(){͙}

public class Prueba {

public static void main(String arg[])


{

MiFechaDeNacimiento miFecha = new MiFechaDeNacimiento();

La variable miFecha es una variable de referencia que maneja un objeto de tipo

MiFechaDeNacimiento.
Continuación clase 4. Sentencias de control

Un lenguaje de programación utiliza sentencias de control para hacer que el

flujo de ejecución avance y se bifurque en función de los cambios de estado del

programa. Las sentencias de control de un programa en Java se pueden

clasificar en las siguientes categorías: SELECCIÓN, ITERACION Y SALTO.

Las sentencias de selección permiten al programa elegir diferentes caminos

de ejecución según sea el resultado de una expresión o el estado de una

variable.

Las sentencias de iteración sirve para que el programa ejecute una o mas

sentencias repetidas veces.

Las sentencias de salto posibilitan que el programa se ejecute de una forma no

lineal.

Sentencias de selección

Java admite dos sentencias de selección: if y switch.

IF

Esta es la sentencia de bifurcación condicional de Java. Se puede utilizar para

dirigir la ejecución del programa hacia dos caminos diferentes. El formato


general de esta sentencia es la siguiente:

if (condicion)

sentencia1;

else

sentencia2;

Cada sentencia puede ser una sentencia única o un conjunto de sentencias

encerradas entre llaves, es decir, un bloque. La condición es cualquier

expresión que devuelva un valor booleano. La clausula else es opcional.

La sentencia if funciona dl siguiente modo: Si la condición es verdadera, se

ejecuta la sentencia1. En caso contrario se ejecuta la sentencia2. En ningún

caso se ejecutaran ambas sentencias. Ejemplo:

int a, b;

//͙..

if(a < b)

a = 0;

else

b = 0;

Si a es menor que b, entonces a se hace igual a cero. En caso contrario, b se

hace igual a cero. En ningún caso se asignara a ambas variables el valor cero.
Importa destacar que solo una sentencia puede aparecer inmediatamente

después del if o else. Si se quiere incluir mas sentencias, es necesario crear

un bloque.

int a, b,c;

//͙..

if(a < b)

a = 0;

c = 0;

else

b = 0;

c = 1;

IF ANIDADOS

Un if anidado es una sentencia if que está contenida dentro de otro if o else.

Cuando se anidan if es importante recordar que una sentencia else siempre

corresponde a la sentencia if mas cercana dentro del mismo bloque y que no

esté asociada ya a otro else.

Ejemplo:
if (i == 10)

if(j <20)

a = b;

if (k >100)

c = d; // este if esta

else

a = c; // asociado con este else

else

a = d; // este else se refiere a if(i ==10)

IF-ELSE-IF MULTIPLES

Un uso muy habitual en programación es la de if-else-if multiples. Esta

construcción se basa en una secuencia de if anidados. Su formato es el

siguiente:

if (condicion)

sentencia;

else if (condicion)

sentencia;

else if (condicion)

sentencia;

.
.

else

sentencia;

La secuencia if se ejecuta de arriba abajo. Tan pronto como una de las

condiciones que controlan el if sea verdadera, las sentencia asociadas con

ese if serán ejecutadas, y el resto no se tiene en cuenta. Si ninguna de las

condiciones es verdadera, entonces se ejecutara el else final. El else final

actúa como una condición por defecto, es decir, si todos los demás

condicionales fallan, entonces se ejecutara la sentencia del ultimo else Si no

hubiera un else final y todas las demás condiciones fueran falsas, entonces no

se ejecutara ninguna acción.

class IfElseMulitple {

public static void main(String args[]) {

int mes = 4; // Abril

String estacion;

if(mes == 12 || mes == 1 || mes == 2)

estacion = "Invierno";

else

if(mes == 3 || mes == 4 || mes == 5)

estacion = "Primavera";

else

if(mes == 6 || mes == J || mes == 8)

estacion = "Verano";
else

if(mes == 9 || mes == 10 || mes == 11)

estacion = "Otoño";

else

estacion = "Mes desconocido";

System.out.println("Abril esta en " +

estacion + ".");

SWITCH

La sentencia switch es una sentencia de bifurcación múltiple de Java.

Proporciona una forma sencilla de dirigir la ejecución a diferentes partes del

programa en función del valor de una expresión. Así en muchas ocasiones, es

una alternativa mejor que una larga serie de sentencias if-else-if. El formato

general de una sentencia switch es:

switch (expresion) {

case valor1;

// Secuencia de sentencias

breake; ͙.

case valor2;

// secuencia de sentencias
breake;

default;

// secuencia de sentencias por defecto

La expresión debe ser del tipo byte, short, int o char; cada uno de los valores

especificados en las sentencias case debe ser un tipo compatible con el de la

expresión. Cada uno de estos valores debe ser un literal único, es decir, una

constante no una variable. No se permite que aparezcan valores duplicados en

las sentencias case. La sentencia switch funciona de la siguiente forma: se

compara el valor de la expresión con cada uno de los valores constantes que

aparecen en las sentencias case. Si coincide con alguno, se ejecuta el código

que sigue a la sentencia case. Si ninguna de las constantes coincide con el

valor de la expresión, entonces se ejecuta la sentencia default. De no existir la

sentencia default y no coinciden ninguno de los valores con las sentencias

case, no se ejecuta ninguna acción. La sentencia break se utiliza dentro del

switch para terminar una secuencia de sentencias. Cuando aparece una

sentencia breake, la ejecución del código continua en la primera línea que

sigue a la sentencia switch completa. El efecto que se consigue es el de saltar

fuera del switch. Es importante destacar que una sentencia switch es mas

eficiente que un conjunto de sentencias if anidadas. A continuación se muestra

un ejemplo sencillo de la sentencia switch.

class EjemploSwitch {
public static void main(String args[]) {

for(int i=0; i<6; i++)

switch(i) {

case 0:

System.out.println("i es cero.");

break;

case 1:

System.out.println("i es uno.");

break;

case 2:

System.out.println("i es dos.");

break;

case 3:

System.out.println("i es tres.");

break;

default:

System.out.println("i es mayor que 3.");

La salida después de la ejecución es:

i es cero

i es uno

i es dos

i es tres
i es mayor que 3

i es mayor que 3

Sentencias de iteración.

Las sentencias de iteración de Java son for, while y do-while. Estas

sentencias crean lo que comúnmente llamamos bucles. Como sabemos, un

bucle ejecuta repetidas veces el mismo conjunto de instrucciones hasta que se

cumpla una determinada condición de finalización. Java tiene un bucle para

ajustarse a cualquier necesidad de programación.

WHILE

El bucle while es la sentencia de iteración más importante de Java. Con este

bucle se repite una sentencia o un bloque mientras se controla que la condición

asociada es verdadera. Su forma general es la siguiente:

while (condicion) {

// cuerpo del bucle

La condición puede ser cualquier expresión booleana. El cuerpo del bucle se

ejecutara mientras la expresión condicional sea verdadera. Cuando la


condición sea falsa, la ejecución pasa a la siguiente línea de código que va

inmediatamente después del bucle. El bucle while que se presenta a

continuación muestra los números desde 1 hasta J.

class While {

public static void main(String args[]) {

int n = 1;

while(n <= J) {

System.out.println("Número " + n);

n++;

La salida después de la ejecución es:

Numero 1

Numero 2

Numero 3

Numero 4

Numero 5

Numero 6

Numero J

Como el bucle while evalúa la expresión condicional al comienzo del mismo, el

cuerpo del bucle no se ejecutara nunca si al comenzar la condición es false.


Por ejemplo, la siguiente oración no podrá imprimirse en el siguiente código:

int a = 10, b = 20;

while(a > b)

System.out.println("Esto no se imprimirá!");

DO ʹ WHILE

En el ciclo while, si la expresión condicional que controla el bucle es

inicialmente falsa, el cuerpo del bucle no se ejecutar ni una sola vez. Sin

embargo, puede haber casos en los que se quiera ejecutar el cuerpo del bucle

al menos una vez, incluso cuando la expresión condicional sea inicialmente

falsa. En otras palabras, puede que se desee evaluar la expresión condicional

de finalización al final del bucle, en lugar de hacerlo al principio.

Afortunadamente, Java dispone de un bucle que lo hace exactamente así, el

bucle do-while. Su forma general es:

do {

// cuerpo del bucle

} while (condicion);

En cada iteración del bucle do-while se ejecuta en primer lugar el cuerpo del

bucle, y a continuación se evalúa la expresión condicional. Si la expresión es


verdadera, el bucle se repetirá. En caso contrario, el bucle finalizara. El

siguiente código muestra un ejemplo de este bucle:

class DoWhile {

public static void main(String args[]) {

int n = 1;

do {

System.out.println("Número " + n);

n++;

} while(n <= J);

La salida después de la ejecución será la misma que arrojó el bucle while del

ejemplo anterior.

El bucle do-while es muy útil cuando se procesa un menú de selección, ya que

normalmente se desea que el cuerpo del menú se ejecute al menos una vez.

FOR

La forma general de la sentencia for es la siguiente:

for (inicialización; condición; iteración ) {


//cuerpo del bucle

Si solamente se repite una sentencia, no es necesaria la utilización de las

llaves.

La inicialización es una expresión que establece el valor de la variable del

control del bucle, que actúa como contador que lo controla.

La condición es una expresión booleana que se compara con la variable de

control. Si la expresión es verdadera, se ejecuta el bucle de lo contrario finaliza.

La iteración incrementa o reduce el valor de la variable de control.

El siguiente ejemplo muestra el uso del ciclo for:

class For {

public static void main(String args[]) {

for(int n=1; n<=J; n++)

System.out.println("Número " + n);

La salida después de la ejecución será la misma que arrojó el bucle while y dowhile

en los ejemplos anteriores.


Sentencias de salto

Java incorpora en su lenguaje, tres sentencia de salto: break, continue y

return.

BREAK

La sentencia breake tiene tres usos en Java. En primer lugar, como hemos

visto, finaliza una secuencia de sentencias en una sentencia switch. En

segundo lugar se puede utilizar para salir de un bucle y, tercero, se puede usar

como una forma ͞civilizada͟ del goto.

EL siguiente código muestra como el breake finaliza un bucle for:

class BreakeUso {

public static void main(String args[]) {

for(int i=1; i<=100; i++) {

if(i == 8)

break; // termina el ciclo si i es igual a 8

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

System.out.println("Ciclo completo.");

A pesar de que el ciclo está programado para que realice 100 iteraciones, al
encontrarse con la sentencia if y verificar que i = 8, entonces el ciclo finaliza

haciendo uso de breake.

CONTINUE

Algunas veces es útil forzar una nueva iteración del bucle sin haber concluido

completamente el procesamiento de la iteración actual; es decir, que se

produzca un salto desde el cuerpo del bucle hasta el final del bucle. La

sentencia que permite tal acción es la sentencia continue. El siguiente ejemplo

utiliza la sentencia continue para hacer que se impriman dos números en cada

línea:

class Continue {

public static void main(String args[]) {

for(int i=0; i<10; i++) {

System.out.print(i + " ");

if (i%2 == 0)

continue;

System.out.println("");

Este código utiliza el operador % para comprobar si y es par. Si es así el bucle

continua sin imprimir una nueva línea.


La salida del programa es la siguiente:

01

23

45

6J

89

RETURN

La utiliza sentencia de control es return. Se utiliza para salir explícitamente de

un método, es decir, hace que el control del programa vuelva al método

llamante. El siguiente ejemplo lo muestra:

class Return {

public static void main(String args[]) {

boolean t = true;

System.out.println("Antes del return.");

if(t)

return; // retorna a quien lo llama

System.out.println("Esto no se ejecutará");

}
La salida del programa es la siguiente:

Antes del return

Es importante tomar en cuenta en el programa anterior es que la sentencia

if(t) es necesaria. Sin ella el compilador Java generaría un error al

comprobar que la última sentencia System.out.println(); nunca se ejecutará.

Para evitar que se produzca este error, la sentencia if(t) se encarga de

engañar al compilador.
Clase 5. Estructuras Estáticas y dinámicas de datos

Entre las estructuras estáticas y dinámicas de datos existentes en Java,

tenemos los arreglos (arrays) y los vectores.

Array

Un arreglo o array es un grupo de variables del mismo tipo al que se hace

referencia por medio de un nombre común. Se puede crear arrays de cualquier

tipo, y pueden tener una dimensión igual a uno o mayor. Para acceder a un

elemento concreto de un array se utilizan sus índices. Los arrays permiten

agrupar información relacionada.

Arrays unidimensionales

Un array unidimensional es, esencialmente, una lista de variables del mismo

tipo. Para crearlo, se debe declarar una variable array del tipo deseado. La

forma general de declarar un array unidimensional es:

tipo nombre_variable [ ] ;

Donde tipo declara el tipo básico del array, que determina el tipo de cada

elemento del mismo. Por lo tanto, el tipo básico determinara que tipo de datos

se almacenara en el array. Por ejemplo, la siguiente línea declara un array

días_del_mes de tipo int:


int dias_del_mes [];

Aunque esta declaración establece que días_del_mes es un array, todavía no

existe realmente ningún array. De hecho el valor de la variable días_del_mes

esta en null, es decir, que no tiene ningún valor. Para que exista el array

debemos reservar el espacio utilizado por este con el operador new de la

siguiente manera:

tipo nombre_variable [ ] = new tipo [ tamaño];

El tamaño nos va a indicar el número de elementos a almacenar en el array.

Luego de realizar el new y colocarle el tamaño, todos los elementos se

inicializan en cero automáticamente (por ser de tipo int).

int dias_del_mes [] = new int [12];

Para acceder a un elemento concreto del array, se debe especificar el número

del índice dentro de corchetes. Todos los índices de un array comienzan en

cero. Ejemplo, para asignar el valor 28 al segundo elemento de días_del_mes:

dias_del_mes[1] = 28;

Esta línea imprimiría el valor correspondiente al índice 3:

System.out.println(dias_del_mes[3]);
Línea El siguiente programa resume las ideas anteriores, creando un array

con el número de días de cada mes.

class Array

public static void main(String args[])

int dias_del_mes[] = new int[12];

dias_del_mes[0] = 31;

dias_del_mes[1] = 28;

dias_del_mes[2] = 31;

dias_del_mes[3] = 30;

dias_del_mes[4] = 31;

dias_del_mes[5] = 30;

dias_del_mes[6] = 31;

dias_del_mes[J] = 31;

dias_del_mes[8] = 30;

dias_del_mes[9] = 31;

dias_del_mes[10] = 30;

dias_del_mes[11] = 31;

System.out.println("Abril tiene " + dias_del_mes[3] + " días.");

El programa imprimirá:

Abril tiene 30 días.


¿Cómo mejoraríamos el programa anterior?

Los arrays también se pueden inicializar cuando se declaran, el proceso es el

mismo que cuando se inicializan tipos primitivos. La manera de hacerlo es

colocando lo valores dentro de llaves separados por comas. El número total de

elementos decidirá el tamaño del array. El siguiente programa es una mejora

del programa anterior:

Class ArrayInicializado

public static void main(String args[])

int month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31};

System.out.println("Abril tiene " + month_days[3] + " dias.");

La salida del programa, será la misma que la del programa anterior.

Arrays multidimensionales
En Java, los arrays multidimensionales son realmente arrays de arrays. Para

declarar una variable de este estilo, hay que especificar cada índice adicional

utilizando otra pareja de corchetes. Por ejemplo:

int dosDimensiones[][] = new int[4][5];

El índice de la derecha determina el número de columnas y el índice de la

izquierda determina el número de filas de lo que ahora se podría llamar matriz.

Para inicializar una matriz de 3x3 se haría lo siguiente:

int month_days[][] = {

{ 1 , 2, 3},

{ 4 , 5, 6},

{ J , 8, 9},

};

Como podemos observar, a los índices de la matriz no se le colocan valores,

pues el tamaño ya lo determinan los elementos con que se inicializa.

Sintaxis alternativa de la declaración de un array.

tipo [ ] nombre_variable ;

Las siguientes declaraciones son equivalentes:


int array1[] = new int [3];

int []array2 = new int [3];

al igual que:

char matriz1[] = new char [3][5];

char []matriz2 = new char [3][5];

Vectores

En los arrays almacenábamos tipo de datos primitivos y tipos complejos. La

condición que se debía considerar era el tamaño exacto del array a utilizar; si

se nos hace imposible saber el tamaño exacto, una solución es la de crear un

array cuya dimensión sea más grande que el número de elementos que

necesitamos guardar. La clase Vector nos proporciona una solución alternativa

a este problema. Un vector es similar a un array, la diferencia es que un vector

crece automáticamente cuando alcanza la dimensión inicial máxima.

¿Cómo creamos un vector?

Al momento de crear un vector, es posible especificar su tamaño inicial y

cuanto crecerá una vez haya alcanzado el tamaño máximo. Por ejemplo:

Vector vector = new Vector (50,10);


Aquí tenemos un vector de tamaño 50, si agregamos el elemento numero 51, el

vector crecerá automáticamente en 10, es decir, su nuevo tamaño seria 60.

Se puede crear un vector utilizando otro constructor:

Vector vector = new Vector(10);

Si queremos agregar un elemento 11, el vector automáticamente duplicara su

dimensión, es decir, su nueva dimensión será 20.

¿Cómo añadimos elementos en un vector?

Existen distintas formas de añadir elementos en un vector, entre estas

tenemos: add(),addElement(), insertElementAt()

Con add() añadimos un elemento al final del vector.

Con addElement, el elemento será agregado después del último elemento

existente en el vector.

Ejemplo:

vector.addElement(͞Elemento͟);

Con insertElementAt, que recibe dos parámetros, se puede insertar un

elemento en una determinada posición, por lo que el primer parámetro indicara

el elemento a insertar y el segundo indicara la posición en donde será

insertado.
Por ejemplo, si queremos insertar la palabra ͞Hola͟, en la posición 5 haremos lo

siguiente:

vector.insertElementAt(͞Hola͟,5);

¿Cómo eliminamos elementos de un vector?

Podemos eliminar todos los elementos de un vector, llamando a la función

miembro removeAllElements. O bien, podemos eliminar un elemento concreto,

por ejemplo el que guarda el string "Hola" de la siguiente manera:

vector.removeElement(͞Hola͟)

Tambien podemos eliminarlo si le indicamos el índice en el que se encuentra.

vector.removeElementAt(5);

Podemos eliminar todos los elementos con el método removeAllElements().

¿Cómo accedemos a los valores de los vectores?

La manera de acceder a los elementos de un vector no es tan sencilla como el

acceso a los elementos de un array. En vez de dar un índice, usamos la

función miembro elementAt. Por ejemplo, vector.elementAt(4) sería equivalente

a v[4], si v fuese un array.


Para tener acceso a todos los elementos del vector, escribimos un código

semejante al empleado para acceder a todos los elementos de un array.

for(int i=0; i<vector.size(); i++){

System.out.print(v.elementAt(i));

Otros

Para saber cuántos elementos posee un vector utilizamos la función size().

Para saber la capacidad de almacenamiento de un vector utilizamos la función

capacity().

Para saber si un elemento está contenido en un vector, utilizamos el método

contains(), pasando como parámetro el elemento buscado.

Algoritmos de búsqueda y ordenamiento

Cuando tenemos datos dentro de vectores o arreglos, muchas veces es

necesario encontrar algún valor en especifico dentro de una de estas

estructuras.

Para esto existen los algoritmos de búsqueda. Entre los más frecuentemente

usados tenemos los siguientes:


Algoritmo de búsqueda lineal.

Este algoritmo se encarga de buscar el elemento deseado dentro de la

estructura de una manera lineal, es decir, se recorre secuencialmente cada una

de la posiciones de dicha estructura hasta conseguirlo. En el mejor de los

casos el elemento se encontrara en la primera posición, mientras que en el

peor de los casos se encontrara en la última posición. Esto trae como

consecuencia la demora del tiempo de ejecución del programa, es por esto que

existe otro algoritmo denominado BUSQUEDA BINARIA, que permite mitigar

este problema.

Algoritmo de búsqueda binaria.

Este algoritmo se encarga de comparar el elemento ubicado en la mitad del

arreglo con el valor que se busca. Si el elemento es igual al valor buscado la

búsqueda finaliza con éxito. De no ser así, pudo haber sucedido que el

elemento que se encuentra en el medio es mayor al buscado, lo que quiere

decir que este se va a encontrar en la mitad izquierda del arreglo. También

puede suceder que el elemento del medio sea menor que el buscado por lo que

este se va a encontrar en la mitad derecha del arreglo. (Asumiendo que se

encuentran ordenados ascendentemente). De cualquier manera la búsqueda

debe continuar en la mitad correspondiente hasta encontrar el elemento.

Algoritmo de ordenamiento.

Dada una estructura de datos con información, muchas veces es necesario


tener un orden lógico dentro de ella con respecto a la información. Este orden

se puede obtener haciendo uso de los algoritmos de ordenamiento. Entre los

algoritmos de ordenamiento más usado tenemos los de: Inserción, Intercambio

y Selección

Algoritmos de inserción

En este algoritmo se consideran uno a la vez los elementos que van a ser

ordenados y se llama de inserción ya que cada elemento se INSERTA en la

posición apropiada con respecto al resto de los elementos ya ordenados.

Un algoritmo de inserción usado es el Insertion Sort, el cual trabaja de la

siguiente manera:

Algoritmos de intercambio

En este algoritmo se toman los elementos por pares (de dos en dos) se

comparan y se INTERCAMBIAN en caso que no se encuentren en el orden

indicado. Se repite dicho proceso hasta que ya se hayan analizado todos los

elementos y ya no se den intercambios.

Un algoritmo de intercambio usado es el Bubble Sort, el cual trabaja de la

siguiente manera:

Algoritmos de selección
En este algoritmo se SELECCIONA el elemento menor de todos los elementos

del conjunto, colocándolo en la posición que le corresponde. Se repite dicho

proceso hasta que todos los elementos hayan sido analizados.

Un algoritmo de selección usado es el Selection Sort, el cual trabaja de la

siguiente manera:

Clase 6. Herencia y polimorfismo

Herencia.

Recordemos que la herencia es el proceso por el cual un objeto adquiere las propiedades de

otro. Esto es importante ya que supone la base del concepto de clasificación jerárquica. Si una

determinada clase encapsula determinados atributos, entonces cualquier subclase tendrá los

mismos atributos más cualquiera que añada como parte de su especialización. En Java una
clase que es heredada se llama superclase y una clase que hereda se llama subclase.

Solamente se puede especificar una superclase para cada subclase creada, es decir, Java no

permite que una subclase herede de múltiples superclases.

Polimorfismo

Es una característica que permite que una interfaz sea utilizada por una clase general de

acciones. Imaginemos una pila, que es una lista en donde el último elemento es el primero que

sale. Podríamos tener un programa que requiera tres tipos distintos de pilas. Una para valores

enteros, otra para valores flotantes y la última para caracteres. El algoritmo que implementa

cada pila es el mismo, incluso aunque los datos almacenados sean diferentes. En un lenguaje

no orientado a objetos sería necesario crear tres rutinas diferentes de pila, cada una con un

nombre distinto. Sin embargo, gracias al polimorfismo, en Java se puede especificar un

conjunto general de rutinas de pila que compartan los mismos nombres.

CLASES ABSTRACTAS

Una de las características más útiles de cualquier lenguaje orientado a objetos es la posibilidad

de declarar clases que definen como se utiliza solamente, sin tener que implementar métodos.

Esto es muy útil cuando la implementación es específica para cada usuario, pero todos los

usuarios tienen que utilizar los mismos métodos. Un ejemplo de clase abstracta en Java es la

clase Graphics:

public abstract class Graphics {

public abstract void drawLine( int x1,int y1,int x2, int y2 );


public abstract void drawOval( int x,int y,int width, int height );

public abstract void drawArc( int x,int y,int width,

int height,int startAngle,int arcAngle );

...

Los métodos se declaran en la clase Graphics, pero el código que ejecutará el método está en

algún otro sitio:

public class MiClase extends Graphics {

public void drawLine( int x1,int y1,int x2,int y2 ) {

<código para pintar líneas -específico de

la arquitectura->

líneas -específico de

la arquitectura->

Cuando una clase contiene un método abstracto tiene que declararse abstracta. No obstante,

no todos los métodos de una clase abstracta tienen que ser abstractos. Las clases abstractas

no pueden tener métodos privados (no se podrían implementar) ni tampoco estáticos. Una

clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase
abstracta ya que estos objetos no tendrían ninguna utilidad, pues una clase abstracta no está

completamente definida. Tampoco podemos declarar constructores abstractos. Cualquier

subclase de una clase abstracta debe implementar todos los métodos abstractos de la

superclase, o bien ser declarada ella misma como abstract.

Una clase abstracta en Java es lo mismo que en C++ virtual func() = 0; lo que obliga a que al

derivar de la clase haya que implementar forzosamente los métodos de esa clase abstracta.

INTERFACES

Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase

parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los métodos

abstractos.

Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior.

Un interface contiene una colección de métodos que se implementan en otro lugar.

La principal diferencia entre interface y abstract es que un interface proporciona un

mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la

herencia.

Por ejemplo:
public interface VideoClip {

// comienza la reproduccion del video

void reproducir();

// pausa la reproduccion

void pausar();

// detiene la reproduccion

void detener();

Las clases que quieran utilizar el interface VideoClip utilizarán la palabra implements y

proporcionarán el código necesario para implementar los métodos que se han definido para el

interface:

class MiClase implements VideoClip {

void reproducir() {

<código>

void pausar() {

<código>

void detener() {

<código>

Al utilizar implements para el interface es como si se hiciese una acción de copiar-y-pegar del

código del interface, con lo cual no se hereda nada, solamente se pueden usar los métodos.
La ventaja principal del uso de interfaces es que una clase interface puede ser implementada

por cualquier número de clases, permitiendo a cada clase compartir el interfaz de

programación sin tener que ser consciente de la implementación que hagan las otras clases

que implementen el interface.

class MiOtraClase implements VideoClip {

void reproducir() {

<código nuevo>

void pausar() {

<código nuevo>

void detener() {

<código nuevo>

Una clase puede implementar más de una interfaz, separando las interfaces por comas. Los

métodos que implementan una interfaz deben declararse como public. Además, el formato

del método implementado debe coincidir exactamente con el formato especificado en la

definición de la interfaz.

Como todo lo que se declara en una interfaz es público, pues corresponde siempre a lo que

puede hacer un objeto, no se usa el calificativo public en los enunciados dentro de la

declaración de la interfaz. Como forzosamente todos los métodos son abstractos, ya que no

tiene implementación, no se usa la palabra abstract. Y como solo se permiten constantes

estáticas, los calificativos static y final se omiten en las declaraciones de constantes dentro de
una interfaz.

You might also like