Separata Java
Separata Java
Programación en Java
El JDK
El Kit de Desarrollo de Java (JDK por sus siglas en Inglés) es un conjunto de programas
que proporciona Sun y que contiene todo lo necesario para crear aplicaciones y applets de
Java. Específicamente, el JDK contiene un compilador de Java, un depurador y
appletviewer con el que puede ejecutar Applets fuera de cualquier Navegador. Además
contiene documentación y applets de ejemplo.
Se puede bajar el JDK de Internet, puede obtener una copia del JDK para su computadora
(el JDK específico para Windows, Mac o Unís) utilizando su navegador. Conéctese al sitio
web de Sun:
Http:// java.sun.com/java.sun.com/products/JDK
De allí siga el enlace Downloads. Ahí encontrará varios enlaces que apuntan a páginas para
bajar varias versiones del JDK.
TIPOS DE DATOS
Tipos Enteros
Los tipos enteros se utilizan para números sin parte fraccionaria. Cada uno de los tipos
enteros puede almacenar un rango diferente de valores.
Tipo Tamaño Rango
long 8 bytes -9,223,372,036,854,775,808L a
9,223,372,036,854,775,807L a
Int 4 bytes -2,147,483,648 a 2,147,483,647
short 2 bytes -32,768 a 32,767
byte 1 byte -128 a 127
El tipo boolean
El tipo bolean sirve para hacer pruebas Lógicas.
Tipo Tamaño Rango
Bolean 1 bit true (verdadero) o false (falso)
El tipo char
El tipo char almacena caracteres alfanuméricos y unicode
El Unicode en Java
El juego de caracteres Unicode de dos bytes soporta los diferentes juegos de caracteres que
componen el texto escrito de los diferentes idiomas. En Java, el tipo char de dos bytes
soporta caracteres Unicode.
Cadenas de Caracteres
En java una cadena es un objeto de la clase String, en vez de ser un tipo de dato primitivo, y
las cadenas no se almacenan en arreglos, lo que se hace como lenguajes como C.
Por ejemplo “Java”, “Programación”
IDENTIFICADORES
Un identificador es un nombre que se le da a algo en Java (Variable,Clase,método).
En Java los nombres no tienen límite de longitud, y las mayúsculas se consideran diferentes
de las minúsculas. El nombre debe iniciar con una letra, después puede tener letras y/o
dígitos. Una letra se define como cualquiera de los caracteres de la ‘A’ a la ‘Z’, de la ‘a’ a la
‘z’, los caracteres ‘_’ y ‘$’, y cualquier carácter unicode que se considere una letra en algún
idioma. Un dígito se define como ‘0’ a ‘9’ y cualquier carácter unicode que se considere
como dígito. No se pueden utilizar símbolos como ‘@’ ni ‘+’ ni espacios en blanco dentro
de los nombres.
VARIABLES
Son simplemente nombres que el programa asocia a localidades especificas de la memoria.
Como indica la palabra variable, el valor almacenado en estas localidades puede cambiar
conforme avanza la ejecución del programa.
Cada variable tiene un tipo específico, el cual indica a la computadora cuanta memoria
necesitan los datos y las operaciones que pueden realizar con ellos.
Declaración de variables
Tipo de dato identificador(es)
Ejemplo:
double precio;
float base,altura;
int edad;
char carácter;
String nombre; // Declaramos la variable nombre tipo cadena
boolean sw; // Declaramos una variable tipo boolean
LITERALES
Los literales presentan valores específicos dentro de los programas.
Por ejemplo :
- Si incluye el numero 12 (el número 12 literal) en un programa, Java lo tomará como
un tipo int. Se puede indicar que una literal entera es de tipo long agregándole al
final la letra L (l o L) por ejemplo 12L.
- Si incluye el número 3.45 lo tomara como tipo double. Todas las literales de punto
flotante se consideran como double en vez de float, para especificar una literal de
tipo float ,se agrega la letra F (F o f) a la literal por ejemplo 3.45F
- Las literales de caracteres se expresan mediante un carácter sencillo entre
apostrofes, como ‘a’,’#’ y ‘9’. Algunas literales de caracteres representan caracteres
que no son imprimibles directamente o accesibles a través del teclado, como
mostraremos en la siguiente tabla.
Escape Significado
\n Linea nueva
\t Tabulador
\b Retroceso
\r Retorno de carro
\f Salto de hoja
\\ Diagonal invertida
\’ Apostrofe
\” Comillas
\o Octal
\xd Hexadecimal
\ud Carácter unicode
- Los literales de cadena constan de una serie de caracteres entre comillas, como por
ejemplo:
String autor=”Luis Joyanes Aguillar”;
String nombre= “Carlos”;
Las cadenas pueden incluir codigos de caracteres de escape como por ejemplo
String cadena = “Esto es \nUna prueba\nde caracteres\n”;
OPERADOR DE ASIGNACIÓN ( = )
Sirve para asignar valores a las variables
variable = valor;
Ejemplo:
x=10;
carácter=’w’
a=10;
a=a*10;
COMENTARIOS EN UN PROGRAMA
Como regla general, cada vez que crea un programa debe de asegurarse de incluir
comentarios para explicar el proceso que se realiza.
Java proporciona 2 formas de agregar comentarios al código:
a) Comentario de varias líneas usando la pareja /* y */, como se muestra a
continuación:
/* Esto es una prueba de un comentario de varias lineas en Java. El compilador de
Java los ignorara por completo. */
b) Comentario de una línea , para eso se usa la doble diagonal (//) para comentar el
codigo. La doble diagonal indica al compilador que lo que esta a la derecha de ellas
(sobre la misma línea) es un comentario
Ejemplo:
int a ; // Se esta declarando una variable entera
OPERADORES ARITMÉTICOS
Java tiene cinco operadores aritméticos básicos
Operador Propósito Ejemplo
+ Suma 5 + 25
- Resta 12-9
* Multiplicación 13.5 * 90.8
/ División 2.9/1.4
% Módulo 7%2 = 1
Al utilizar valores aritméticos, Java entrega un resultado del mismo tipo que el operando de
mayor precisión. Por ejemplo, al multiplicar un int por un float el resultado es de tipo float.
La mayoría de los operadores aritméticos se comportan de forma previsible. La excepción
es el operador de división. Si hace una división entre valores enteros el resultado también
sera entero. En otras palabras si divide 7 entre 2, el resultado será 3. De esta forma si al
hacer una división desea un resultado de punto flotante, debe asegurarse que el tipo de los
operandos sea float o double.
Ejemplo:
int t;
float r;
int a=10, b=4;
t =10/4; // El resultado es 2
r= 10f / 4f // el resultado es 2.5
r= (float) a / (float) b; // El resultado es 2.5
short z;
byte x=40;
z =x;
Se esta asignando un valor byte (que puede tener valores entre –128 a 127) a una variable
tipo short (que tiene valores entre –32768 a 32767), sin necesidad de una conversión
explicita.
A continuación se presenta un resumen de algunas de las asignaciones que no requieren de
una conversión explicita en Java. Un tipo puede ser asignado a cualquiera de los tipos que
están a su izquierda.
double <= float <= long <= int <= short <= byte
Conversion Explicita
Mediante la conversión explicita se le indica al compilador de Java que es intencional la
conversión (y que acepta las consecuencias de cualquier pérdida de precisión).
El formato general de conversión es :
(tipo) valor_a_convertir
Para hacer una conversión explicita, sólo debe rodear al tipo de variable con paréntesis, por
ejemplo (float). Las siguientes instrucciones convierten un tipo double a float
float resultado;
double valor=12.789561493;
resultado = (float) valor;
Operador incremento ++
Permite incrementar el valor de una variable en uno.
Se puede usar el operador ++variable o variable++..
Ejemplo:
int alfa=50;
alfa++; // ahora el valor de alfa es 51
float x=12.56;
++x; // ahora el valor de x = 13.56
Operador decremento --
Permite disminuir el valor de una variable en uno.
Se puede usar el operador –variable o variable--.
Ejemplo :
float w = 200.67;
w--; // ahora el valor de la variable es 199.67
int t=34;
--t; // ahora el valor de la variable es 33
Por otra parte si utiliza operadores postfijos(variable++ o variable--), Java utiliza primero el
valor de la variable y luego realiza el operador incremento o decremento.
Ejemplo:
int x=6, y;
y=x++ ; // Aquí primero asigna y luego incrementa el valor de x
El valor final de y es 6 y el valor de x es 7
Al escribir una aplicación sencilla de Java se debe definir un método main, que se procesa
cuando el programa inicia su ejecución. En el método main se especifican las funciones
que realiza el programa.
Toda aplicación se comienza declarando una clase con la palabra public class y un
nombre, y este nombre tiene que ser idéntico al nombre del archivo que se va a grabar pero
con extensión Java.
En el ejemplo al colocar public class HolaMundo se esta declarando la clase llamada
HolaMundo.
El archivo se debe grabar como HolaMundo.java igual que el nombre de la clase.
Dentro de main, la aplicación utiliza el metodo System.out.println para desplegar el
mensaje “¡Hola Mundo!” en la consola del Sistema.
En este ejemplo se ha declarado una variable nombre de tipo String y se esta leyendo desde
la consola utilizando un objeto llamado in el cual llama al método readLine para leer una
cadena y asignarle a la variable nombre.
Si se desea leer valores numéricos enteros o reales, primero se lee como cadena y luego se
convierten estos valores a numéricos. Para esto se utilizan los siguientes métodos
import java.io.*;
import java.io.*;
import java.io.*;
Operadores Relacionales
Operador Función
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
== Igual que
!= Diferente que
Operadores Lógicos
Operador Funcion
&& Y
|| O
! Negación
Se utiliza para tomar decisiones. El programa prueba una condición con la instrucción if. Si
la condición es verdadera, el programa ejecuta una instrucción ( o un bloque de
instrucciones relacionadas). Por el contrario si la condición es falsa, el programa puede
ejecutar un conjunto diferente de instrucciones especificado por la cláusula else.
La sintaxis de la sentencia else es la siguiente:
if(condición)
instruccion1;
else
instruccion2;
o también.
if (condicion)
{
bloque de Instrucciones1;
}
else
{
bloque de Instrucciones2;
}
La sentencia else es opcional. A veces se puede omitir
if(condición)
{
Instrucciones;
}
1) Hacer un programa para que se ingrese 2 números y se reporte el mayor
de ellos.
import java.io.*;
import java.io.*;
3) Hacer un programa para que calcule e imprima los valores de las raíces
reales de una ecuación cuadrática
AX2 + BX + C =0
import java.io.*;
import java.lang.*;
public class P203{
public static void main(String arg[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double A,B,C,X1,X2,D;
System.out.print("Coeficiente A: ");
A=Double.parseDouble(br.readLine());
System.out.print("Coeficiente B: ");
B=Double.parseDouble(br.readLine());
System.out.print("Coeficiente C: ");
C=Double.parseDouble(br.readLine());
if(A==0)
System.out.println("NO ES UNA ECUACION CUADRATICA");
else
{
D=Math.pow(B,2)-4*A*C;
if(D>=0)
{
X1=(-B+Math.sqrt(D))/(2*A);
X2=(-B-Math.sqrt(D))/(2*A);
System.out.println("X1 = "+X1);
System.out.println("X2 = "+X2);
}
else
System.out.println("RAICES IMAGINARIAS ");
}
}
}
import java.io.*;
import java.io.*;
import java.io.*;
import java.io.*;
ps=40*ph+(ht-40)*1.5*ph;
System.out.println("El Pago semanal es : "+ps);
}
}
import java.io.*;
import java.io.*;
import java.io.*;
12) Los empleados de una fabriva trabajan en dos trunos: diurno y nocturno.
Se desea calcular el jornal diario de acuerdo a los siguiente puntos:
- La tarifa de las horas diurnas es de S/. 1.5
- La tarifa de las horas nocturnas es de S/. 2.25
import java.io.*;
Clase String
Esta clase almacena una cadena de caracteres. Una cadena es una serie de caracteres que se
trata como una unidad. Una cadena puede incluir letras, dígitos y diversos caracteres
especiales como +,-,*,/,$ y otros.
Una cadena en Java es un objeto de la clase String.
Los literales de cadena o constantes de cadena en Java se escriben como una secuencia de
caracteres cerradas entre comillas.
Ejemplo:
“Computación”, “Java es fácil”,
cadena1.equals(cadena2) : El método equals devuelve true si las dos cadenas son iguales y
false en caso contrario..
cadena.substring(indice) : Devuelve una subcadena que esta conformada por todos los
caracteres que comienzan en indice e incluye todos los caracteres siguientes hasta el fin de
la cadena.
Ejemplo:
String cad1 = String.valueOf(12);
switch(expresión)
{
case cte1 : Instrucciones1;
break;
case cte2 : Instrucciones2:
break;
case cte3 : Instrucciones3;
break;
.
.
.
default : Instrucciones;
}
expresión : Puede ser de los tipos primitivos byte, char, short o int no puede ser de otro tipo.
Esta expresión se compara con cada uno de las constantes que se encuentran en los case, si
es igual a alguna de ellas se ejecutan las expresiones correspondientes y se sale del switch.
Si no es igual a ninguna de ellas se ejecutan las instrucciones que siguen a default.
La sentencia default es opcional.
En la sentecia switch solo se compara por igualdad no por otra relación.
break;
case 4 : System.out.println("ABRIL");
break;
case 5 : System.out.println("MAYO");
break;
case 6 : System.out.println("JUNIO");
break;
case 7 : System.out.println("JULIO");
break;
case 8 : System.out.println("AGOSTO");
break;
case 9 : System.out.println("SETIEMBRE");
break;
case 10 : System.out.println("OCTUBRE");
break;
case 11 : System.out.println("NOVIEMBRE");
break;
case 12 : System.out.println("DICIEMBRE");
break;
default :
System.out.print("Numero equivocado");
}
}
}
import java.io.*;
import java.io.*;
switch(letra)
{
case 'a': case 'A':
System.out.println("EXCELENTE");
break;
case 'b': case 'B':
System.out.println("BUENO");
break;
case 'c': case 'C':
System.out.println("REGULAR");
break;
case 'd': case 'D':
System.out.println("MALO");
break;
case 'e': case 'E':
System.out.println("PESIMO");
break;
default :
System.out.println("letra equivocada");
}
}
}
import java.io.*;
switch(op)
{
case 1 : res=num1+num2;
System.out.println("La Suma es : "+res);
break;
case 2 : res=num1-num2;
System.out.println("La Resta es : "+res);
break;
case 3 : res=num1*num2;
System.out.println("La multiplicacion es :"+res);
break;
case 4 : if(num2!=0)
{
res=num1/num2;
System.out.println("La division es :"+res);
}
else
System.out.println("No se puede dividir entre cero");
break;
default :
System.out.println("Numero de Opcion Fuera de Rango");
}
}
}
PROCESOS REPETITIVOS
1) while (mientras)
while(condición)
{
Instrucciones;
}
do{
Instrucciones;
}while(condición);
En este proceso primero se realizan las instrucciones y luego se verifica la condición, si
esta es verdadera, se realizan de nuevo las Instrucciones. Este proceso se ejecuta hasta que
la condición llegue a ser falsa.
A este proceso se le conoce como de Salida controlada pues la condición se encuentra al
final.
3) for
Donde :
Sentencia break
La sentencia break, cuando se ejecuta en una estructura while, for, do..while o switch, causa
la salida inmediata de la estructura. La ejecución continua con el siguiente instrucción
después de la estructura. Un uso común de la sentencia break es terminar antes de tiempo
de un ciclo (for, while, do..while) o saltarse el resto de una estructura switch
Ejemplo:
Setencia continue
La sentencia continue, cuando se ejecuta en una estructura while, for o do...while, se salta
el resto de las instrucciones del cuerpo de la estructura y continua con la siguiente iteración
del ciclo.
En las estructuras while, do...while, la prueba para continuar el ciclo se evalúa
inmediatamente después de ejecutarse la sentencia continue. En la estructura for, se ejecuta
la expresión de incremento y luego se ejecuta la prueba para ejecutar el ciclo.
Ejemplo:
import java.io.*;
import java.io.*;
import java.io.*;
}
}
import java.io.*;
import java.io.*;
import java.io.*;
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,i,x,sp=0,si=0,cp=0,ci=0;
double mi;
do{
System.out.print("Valor de n : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
for(i=1;i<=n;i++)
{
System.out.print("Ingrese numero : ");
x=Integer.parseInt(br.readLine());
if(x%2==0)
{
cp++;
sp=sp+x;
}
else
{
ci++;
si=si+x;
}
}
if(cp>0)
{
System.out.println("La suma de los numeros pares es : "+sp);
System.out.println("La cantidad de numeros pares es : "+cp);
}
else
System.out.println("No se Ingresaron numeros pares");
if(ci>0)
{
mi=(double)si/ci;
System.out.println("La media de los impares es : "+mi);
}
else
System.out.println("No se Ingresaron numeros impares");
}
}
import java.io.*;
import java.io.*;
do{
System.out.print("Ingrese numero positivo o cero : ");
n=Integer.parseInt(br.readLine());
}while(n<0);
for(i=1;i<=n;i++)
f=f*i;
System.out.println("El factorial es : "+f);
}
}
import java.io.*;
import java.io.*;
for(i=1;i<=n;i++)
{
if(i%2==0) s=s-1.0/i;
else s=s+1.0/i;
}
System.out.println("La sumatoria es : "+s);
}
}
import java.io.*;
import java.io.*;
for(i=1;i<=n;i++)
{
t=p+s;
System.out.print(t+" ");
p=s;
s=t;
}
System.out.println();
}
}
import java.io.*;
import java.io.*;
METODOS
Los métodos en java permiten modularizar sus programas. Todas las variables declaradas
en las definiciones de métodos son variables locales es decir solo se conocen en el método
que se definen. Casi todos los métodos tienen una lista de parámetros que permiten
comunicar información entre métodos. Los parámetros de un método también son variables
locales.
Donde :
tipo_de_valor_devuelto : Indica el tipo de valor que se devuelve al método invocador. Si
un método no devuelve un valor, el tipo_de_valor_devuelto se declara como void.
nombre_del_método : Es cualquier identificador válido
lista_de_parámetros : Es una lista separada separada por comas que contiene las
declaraciones de las variables que se pasarán al método. Si un método no recibe parámetros
las lista_de_parámetros se deja vacía.
El cuerpo del método es el conjunto de declaraciones e instrucciones que constituyen el
método.
Cuando un programa encuentra una llamada a un método, se transfiere el control desde el
punto de invocación al método invocado, se ejecuta el método y el control regresa al
invocador.
Un método invocado puede devolver el control al invocador de tres maneras.
Si el método no devuelve valor, el control se devuelve al llegar a la llave derecha que
termina el método o ejecutando la sentencia
return;
Si el método devuelve un valor, la sentencia
return expresión
Devuelve el valor de Expresión.
Por ejemplo si se desea calcular la suma de dos números enteros. Se podría definir el
siguiente método:
Supongamos que deseamos un método para mostrar el mensaje “Java es fácil de aprender”.
Se podría definir el método de la siguiente manera
void mensaje()
{
System.out.println(“Java es fácil de Aprender”);
}
import java.io.*;
class Metodos01
{
public static int factorial(int n)
{
int f=1,i;
for(i=1;i<=n;i++)
f=f*i;
return f;
}
import java.io.*;
class Metodos02{
public static int mcd(int a, int b)
{
int d=2,p=1;
while(d<=a && d<=b)
if(a%d==0 && b%d==0)
{
p=p*d;
a=a/d;
b=b/d;
}
else
d++;
return p;
}
do{
System.out.print("Ingrese el segundo numero : ");
y=Integer.parseInt(br.readLine());
}while(y<0);
m=mcd(x,y);
System.out.println("El m.c.d de "+x+" y "+y+" es : "+m);
}
}
import java.io.*;
class Metodos03{
public static void reporteDivisores(int n)
{
int d;
System.out.println("Los divisores del numero son :");
for(d=1;d<=n;d++)
if(n%d==0) System.out.print(d+" ");
System.out.println();
}
}
}
import java.io.*;
class Metodos05{
public static boolean esPrimo(int n)
{
int d=1;
do{
d=d+1;
}while( n%d!=0 && d*d<=n);
if(d*d>n) return true;
else return false;
}
Cuando una clase tiene métodos estáticos se puede invocar a esos métodos de la siguiente
manera: NombreClase.nombreMetodo, como se hace con los métodos de la clase Math,
para la raiz cuadrada se coloca Math.sqrt(x), para la potencia Math.pow(x,n).
Por ejemplo crearemos una clase llamada Aritmética que contenga métodos estaticos
esPrimo (que verifica si un numero es primo), factorial, mcd(Calcula el m.c.d. de dos
números) , reporteDivisores y reporteFactoresPrimos.
Estos métodos como son estaticos pueden ser llamados como :
Aritmética.nombre_metodo(parámetros)
Como se ve en el programa que sigue a la clase Aritmetica
class Aritmetica{
class PruebaAritmetica{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n;
do{
System.out.print("Ingrese numero :");
n=Integer.parseInt(br.readLine());
}while(n<0);
System.out.println("el Factorial es : "+Aritmetica.factorial(n));
if(Aritmetica.esPrimo(n))
System.out.println("El numero es primo");
else
System.out.println("El numero no es primo");
}
}
Los identificadores que representan variables locales de un método ( esto es, los parámetros
y la variables declaradas en el cuerpo del método) tienen duración automática. Las
variables de duración automática se crean cuando se ingresa en el bloque en el que se
declaran, existen mientras dicho bloque está activo y se destruyen cuando se sale del
bloque.
Java también tiene métodos de duración estática. Las variables y métodos de duración
estática existen desde el momento en el que la clase en la que se definen se carga en la
memoria para ejecutarse, hasta que el programa termina. El espacio de almacenamiento
para las variables de duración estática se asigna e inicializa una vez cuando su clase se
carga en la memoria. En el caso de los métodos de duración estática comienza a existir
cuando su clase se carga en la memoria.
Recursividad
Un método es recursivo cuando se llama a si mismo ya sea directamente e indirectamente.
Para que la recursividad termine, cada vez que el método recursivo se llama a si mismo con
una versión un poco más sencilla del problema original, la secuencia de problemas cada vez
menores debe convergir hacia el caso base. Cuando el método reconoce el caso base,
devuelve el resultado a la llamada de método previa, y se inicia una secuencia de
devoluciones que termina cuando la llamada del método original devuelve el resultado
final.
Recursividad vs Iteración
Tanto la iteración como la recursión se basan en una estructura de control.: La iteración usa
una estructura de repetición; la recursión una estructura de selección.
Ejercicios
1) Hacer un programa para calcular el factorial de un número.
import java.io.*;
class recursividad01{
import java.io.*;
class recursividad02{
import java.io.*;
class recursividad03{
import java.io.*;
class recursividad04{
x=Integer.parseInt(br.readLine());
}while(x<=0);
do{
System.out.print("Ingrese segundo numero :");
y=Integer.parseInt(br.readLine());
}while(y<=0);
System.out.println("El mcd de "+x+" y "+y+" es : "+mcd(x,y));
}
}
import java.io.*;
class recursividad05{
import java.io.*;
class recursividad06{
if(n<b)
System.out.print(n);
else
{
conversionBase(n/b,b);
System.out.print(n%b);
}
}
Sobrecarga de Métodos
Java permite definir varios métodos con el mismo nombre en tanto dichos métodos tengan
diferentes juegos de parámetros ( con base en el número y el orden de los parámetros). Esto
se denomina sobrecarga de métodos. Cuando se invoca un método sobrecargado, el
compilador de Java selecciona el método adecuado examinando el número, los tipos y el
orden de los argumentos en la llamada. La sobrecarga de métodos suele utilizarse para crear
varios métodos con el mismo nombre que realizan tareas similares, pero sobre datos de
diferentes tipos.
import java.io.*;
class sobrecarga01{
ARREGLOS
Un arreglo es un grupo contiguo de posiciones de memoria relacionadas entre sí. Estas
posiciones están relacionadas por el hecho de que todas tienen el mismo nombre y el
mismo tipo. Para referirnos a una posición o elemento en particular dentro del arreglo,
especificamos el nombre del arreglo y el subíndice del elemento.
Un subíndice puede ser un entero o una expresión entera. Si un programa emplea una
expresión como subíndice, la expresión se evalúa para determinar el elemento específico
del arreglo.
Los arreglos de Java siempre comienzan con el elemento 0.
Declaración de un arreglo
En java existen 2 formas de declarar arreglos.
Por ejemplo si se desea declarar un arreglo de enteros, se podria hacer de esta manera:
Creación de un Arreglo
Después de declarar un arreglo, se tiene que crearlo. Para crearlo se coloca la palabra clave
new seguida del tipo de dato y del tamaño del arreglo entre corchetes..
Ejm:
numeros = new int[100]; // se esta creando un arreglo de 100 elementos enteros
También se puede declarar y crear un arreglo en una sola instrucción. Por ejemplo:
Inicialización de un arreglo
En Java se pueden inicializar arreglos al declararlos. Cuando se especifica valores iniciales
dentro de la declaración de un arreglo, Java realiza la operación new y define el tamaño del
arreglo de forma automática.
Ejemplo:
int arreglo1 [] = { 1, 2, 3, 4, 5};
Referencias a arreglos
Java utiliza referencias para apuntar a los arreglos.
Por ejemplo:
Las siguientes instrucciones utilizan las referencia arreglo para acceder a dos arreglos
distintos.
import java.io.*;
class ReferenciaArreglo{
for(int indice=0;indice<arreglo.length;indice++)
System.out.println(arreglo[indice]);
arreglo=segundo;
System.out.println("Segundo Arreglo ");
for(int indice=0;indice<arreglo.length;indice++)
System.out.println(arreglo[indice]);
}
}
Ejercicios
1) Hacer un programa para ingresar n valores reales en un arreglo y los muestre en la
pantalla, además reportar el mayor, el menor y el promedio.
import java.io.*;
public class arre01{
public static void main(String arg[])throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
double x[],mayor,menor,promedio,suma=0;
int n,i;
do{
System.out.print("Cantidad de elementos del arreglo : ");
n=Integer.parseInt(br.readLine());
}while(n<=0 || n>100);
x=new double[n];
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=Double.parseDouble(br.readLine());
}
mayor=menor=x[0];
for(i=1; i<n; i++)
if (x[i]>mayor) mayor=x[i];
else
if(x[i]<menor) menor=x[i];
suma=suma+x[i];
promedio=suma/n;
System.out.println("El mayor es " +mayor);
System.out.println("El menor es:"+ menor);
System.out.println("El promedio es : "+ promedio);
}
}
2) Programa para ingresar n valores reales en un arreglo y calcular la desviación standard.
import java.io.*;
int n,i;
do{
System.out.print("Cantidad de elementos del arreglo : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
x=new double[n];
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=Double.parseDouble(br.readLine());
}
suma=0;
for(i=0;i<n;i++)
suma=suma + Math.pow(x[i]-p,2);
ds=Math.sqrt(suma/(n-1));
import java.io.*;
double x[],temp;
int n,i,j;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
do{
System.out.print("Cantidad de elementos del arreglo : ");
n=Integer.parseInt(br.readLine());
}while(n<=0 || n>100);
x=new double[n];
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=Double.parseDouble(br.readLine());
}
System.out.println("Arreglo Ingresado");
for(i=0; i<n;i++)
System.out.println("x["+i+"]: "+x[i]);
for(i=0,j=n-1;i<n/2;i++,j--)
{
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
System.out.println("Arreglo Invertido");
for(i=0; i<n;i++)
System.out.println("x["+i+"]: "+x[i]);
}
}
4) Programa para ingresar 2 vectores de n elementos reales cada uno y reportar el producto
escalar de ellos
import java.io.*;
do{
System.out.print("Numero de elementos de los vectores : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
x=new double[n];
y=new double[n];
pe=0;
for(i=0;i<n;i++)
pe=pe+x[i]*y[i];
System.out.println("El Producto escalar es : " +pe);
}
}
import java.io.*;
do{
System.out.print("Cantidad de nombres a ingresar : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
nombres=new String[n];
for(i=0; i<n;i++)
{
System.out.print("Nombre["+i+"]: ");
nombres[i]=br.readLine();
}
nombres=new String[n];
for(i=0; i<n;i++)
{
System.out.print("Nombre["+i+"]: ");
nombres[i]=br.readLine();
}
System.out.println("nombres ingresados");
for(i=0; i<n;i++)
System.out.println("Nombre["+i+"]: "+nombres[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(nombres[i].compareToIgnoreCase(nombres[j])>0)
{
temp=nombres[i];
nombres[i]=nombres[j];
nombres[j]=temp;
}
import java.io.*;
double x[],num;
int n,i,p;
do{
System.out.print("Cantidad de elementos del arreglo : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
x=new double[n];
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=Double.parseDouble(br.readLine());
}
p=-1;
for(i=0;i<n ;i++)
if(x[i]==num)
{
p=i;
break;
}
if(p!=-1)
{
for(i=p;i<n-1;i++)
x[i]=x[i+1];
n=n-1;
System.out.println("Nuevo arreglo ");
for(i=0; i<n;i++)
System.out.println("x["+i+"]: "+x[i]);
}
else
System.out.println("El numero no se encuentra en el arreglo");
}
8) Programa para ingresar n puntos del plano cartesiano y reportar la ecuacion de la recta de
regresion
import java.io.*;
int n,i;
do{
System.out.print("Cantidad de Puntos : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
x=new double[n];
y=new double[n];
System.out.println("Ingreso de datos");
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=Double.parseDouble(br.readLine());
System.out.print("y["+i+"]: ");
y[i]=Double.parseDouble(br.readLine());
}
for(i=0;i<n;i++)
{
sx=sx+x[i];
sy=sy+y[i];
sxx=sxx+x[i]*x[i];
sxy=sxy+x[i]*y[i];
M = (n*sxy-sx*sy)/(n*sxx -sx*sx);
B = (sxx*sy -sxy*sx)/(n*sxx -sx*sx);
9) Ingresar los nombres y las notas de n alumnos y reportar la lista en orden alfabetico y en
orden de merito
import java.io.*;
do{
System.out.print("Numero de Alumnos : ");
n=Integer.parseInt(br.readLine());
}while(n<=0);
nombres=new String[n];
notas=new int[n];
for(i=0; i<n;i++)
{
System.out.print("Nombre["+i+"]: ");
nombres[i]=br.readLine();
System.out.print("Nota["+i+"]:");
notas[i]=Integer.parseInt(br.readLine());
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(nombres[i].compareToIgnoreCase(nombres[j])>0)
{
tempNombre=nombres[i];
nombres[i]=nombres[j];
nombres[j]=tempNombre;
tempNota=notas[i];
notas[i]=notas[j];
notas[j]=tempNota;
}
System.out.println("Lista en Orden Alfabetico");
for(i=0; i<n;i++)
System.out.println(nombres[i]+" "+notas[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(notas[i]<notas[j])
{
tempNombre=nombres[i];
nombres[i]=nombres[j];
nombres[j]=tempNombre;
tempNota=notas[i];
notas[i]=notas[j];
notas[j]=tempNota;
}
System.out.println("Lista en Orden de Merito");
for(i=0; i<n;i++)
System.out.println(nombres[i]+" "+notas[i]);
}
}
Excepciones
Tratamiento de Excepciones
La estructura de manejo de excepciones es:
try
{
bloque de sentencias;
} catch (ClassException e1) {
bloque de sentencias;
} catch (ClassException e2) {
bloque de sentencias;
} finally {
bloque de sentencias;
}
Un bloque try indica a Java que ejecute las instrucciones que le siguen a menos que ocurra
una excepcion. Si se lanza una excepcion, Java sale del bloque try, saltándose el resto de
instrucciones, y busca un bloque catch (atrapar) correspondiente. Si no ocurre una
excepcion, Java ejecuta todas las instrucciones del bloque y continúa su ejecución en la
primera instrucción que sigue a los bloques try/catch. Si se encuentra el bloque finally estas
instrucciones se ejecutan asi no haya ocurrido una excepcion. En conclusión el bloque
finally siempre se ejecuta.
En un programa escrito en Java, el bloque try se sigue con uno o varios bloques catch..
Un bloque catch utiliza la palabra clave catch y especifica la excepcion que el programa
intenta detectar como por ejemplo:
Si se lanza una excepcion que concuerda con la que se especifica en la instrucción catch,
Java ejecuta las instrucciones del bloque correspondiente. Java pasa un objeto Exception al
bloque catch, que proporciona al bloque detalles acerca de la excepcion.
Ejemplo:
import java.io.*;
class ManejoExcepcion01{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
String str;
int numero;
try{
System.out.print("Ingrese numero : ");
str=br.readLine();
numero=Integer.parseInt(str);
System.out.println("Numero ingresado : "+numero);
}
catch(NumberFormatException ex)
{
System.out.println("No es un numero");
}
}
}
En el caso de que la cadena str contenga caracteres no numéricos, se produce una excepción
del tipo NumberFormatException que es capturada y se imprime el mensaje "No es un
número".
La clase base Throwable de todas las clases que describen las excepciones, redefine la
función toString, que devuelve el nombre de la clase que describe la excepción
acompañado del mensaje asociado.
Podemos extraer dicho mensaje mediante la función miembro getMessage, del siguiente
modo
try{
//...
}catch(NumberFormatException ex){
System.out.println(ex.getMessage());
}
Hay veces en las que se desea estar seguro de que un bloque de código se ejecute se
produzcan o no excepciones. Se puede hacer esto añadiendo un bloque finally después del
último catch. Esto es importante cuando accedemos a archivos, para asegurar que se cerrará
siempre un archivo se produzca o no un error en el proceso de lectura/escritura.
try{
//Este código puede generar una excepción
}catch(Exception ex){
//Este código se ejecuta cuando se produce una excepción
}finally{
//Este código se ejecuta se produzca o no una excepción
}
La definición de la clase es muy simple. Se le pasa un string msg, que contiene un mensaje,
en el único parámetro que tiene el constructor de la clase derivada y éste se lo pasa a la
clase base mediante super.
Como vemos el numerador que vale 120 tiene un valor fuera del intervalo especificado en
la función rango, por lo que se lanza una excepción cuando se llega a la llamada a dicha
función en el bloque try. Dicha excepción es capturada por el bloque catch correspondiente
a dicha excepción, y se ejecutan las sentencias de dicho bloque. En concreto, se obtiene
mediante getMessage el texto del mensaje que guarda el objeto ex de la clase
ExcepcionIntervalo.
Hay otra alternativa para el ejercicio anterior, que es la de definir una función denominada
calcular, que devuelva el cociente entre el numerador y el denominador, cuando se le pasa
los strings obtenidos de los respectivos controles de edición. La función calcular, convierte
los strings en números enteros, verifica el rango, calcula y devuelve el cociente entre el
numerador y el denominador,
Vemos que la función calcular puede lanzar, throws, tres tipos de excepciones. En el cuerpo
de la función se crea, new, y se lanza, throw, explícitamente un objeto de la clase
ExcepcionIntervalo, definida por el usuario, e implícitamente se crea y se lanza objetos de
las clases NumberFormatException y ArithmeticException definidas en el lenguaje Java.
La sentencia que llama a la función calcular dentro del bloque try puede producir alguna de
las tres excepciones que es capturada por el correspondiente bloque catch.
CLASE
Una clase es una plantilla o prototipo que define las variables y los métodos comunes a
todos los objetos de cierto tipo. Las clases definen estado(variables) y comportamiento
(métodos) de todos los objetos.
Las clases son el mecanismo por el que se pueden crear nuevos Tipos en Java. Las clases
son el punto central sobre el que giran la mayoría de los conceptos de la
Orientación a Objetos.
Una clase es una agrupación de datos y de código (métodos) que actúa sobre esos datos, a
la que se le da un nombre.
import java.io.*;
class Rectangulo{
private double base;
private double altura;
public Rectangulo(double b, double h) // Constructor
{
base = b;
altura=h;
}
public void setBase(double b)
{
base=b;
}
public void setAltura(double h)
{
altura=h;
}
public double getBase()
{
return base;
}
public double getAltura()
{
return altura;
}
public double area()
{
return base*altura;
}
La clase Rectángulo tiene 2 atributos base y altura los cuales son privados esto quiere decir
que estas 2 variables son visibles en la clase Rectángulo.
El primer método que se ha implementado es el constructor , este método se llama igual
que la clase y no devuelve ningún valor y permite inicializar los atributos de la clase. Este
método se llama en el momento de crear un objeto.
Como los atributos base y altura son privados, para que los usuarios que usan los objetos
puedan modificar los atributos se crean los métodos setBase(double b) y setAltura(double
h). Y si deseamos obtener los valores de los atributos creamos los métodos getBase() y
getAltura().
Además se han creado los métodos area(), perímetro() y diagonal() que permiten calcular el
area, perímetro y diagonal del rectangulo.
En el método toString() (a cadena) se crea una cadena con la información de los atributos
de la clase. En realidad podemos colocar cualquier información.
double b, h;
Rectangulo R;
System.out.print("Ingrese base : ");
b=Double.parseDouble(br.readLine());
System.out.print("Ingrese altura : ");
h=Double.parseDouble(br.readLine());
R = new Rectangulo(b,h);
System.out.println("Rectangulo : "+R);
System.out.println("Area : "+R.area());
System.out.println(“Perimetro : “+R.perimetro());
System.out.println("Diagonal : "+R.diagonal());
}
}
Dentro del metodo main de la clase PruebaRectangulo se ha declarado dos variables de tipo
primitivo b,h y una variable R que es de tipo Rectangulo.
Al colocar :
Rectangulo R;
Se esta declarando a R como un Objeto de la Clase Rectangulo.
La declaración no crea nuevos objetos. En la declaración (Rectangulo R) se declara una
variable llamada R la cual será usada para referirnos a un Objeto Rectangulo. La referencia
esta vacía. Una referencia vacía es conocida como referencia nula.
Al colocar :
R = new Rectangulo(3,4);
Con el operador new creamos un objeto de la clase Rectangulo.El operador new instancia
una clase asignando memoria para el nuevo Objeto.
El operador new requiere una llamada a un constructor de la clase a instanciar. El
constructor inicializa el nuevo objeto.El operador new retorna una referencia al objeto
creado.
Una vez creado el objeto para poder llamar a sus metodos usamos lo siguiente
objeto.nombredeMétodo. Por ejemplo para calcular el area usamos R.area(), para calcular
el perímetro R.perimetro() y para calcular la diagonal R.diagonal().
Al escribir System.out.println(“Rectangulo : “+R); en realidad se esta llamando tácitamente
al método toString de la clase R.
Si se deseara modificar el atributo base del Objeto se debe usar el método setBase por
ejemplo si después de crear el objeto queremos que base tenga el valor 10, se colocaria la
siguiente instrucción : R.setBase(10); lo mismo se hace si se quiere modificar la altura.
Si se desea saber el valor de algún atributo del objeto se usa los métodos get, por ejemplo si
quisiera imprimir el valor de la base del objeto R se tendria que escribir lo siguiente :
System.out.println(“La base es : “+R.getBase());
Ejercicios
1) Crear la clase Cilindro con atributos radio y altura y que se pueda calcular el area y
el volumen del cilindro.
2) Crear la clase numeros que tenga como atributos dos numeros y se calcule su suma,
resta, multiplicación, división.
3) Crear la clase Alumno que tenga como atributos nombre, nota1 y nota2 y permita
calcular el promedio y su condicion (aprobado o desaprobado)
4) Crear la clase Trabajador que tenga como atributos nombre, preciHora y
horasTrabajadas y se calcule salario Bruto, impuestos( 10% del Salario Bruto) y
salario Neto (Salario Bruto – Impuestos)
5) Crear la clase Movil con atributos velocidad Inicial, aceleración y tiempo y se pueda
calcular el espacio recorrido por el móvil
1) Crear la clase Cilindro con atributos radio y altura y que se pueda calcular el area y
el volumen del cilindro.
import java.io.*;
class Cilindro{
private double radio;
private double altura;
2) Crear la clase numeros que tenga como atributos dos numeros y se calcule su suma,
resta, multiplicación, división.
import java.io.*;
class Numeros{
private double numero1;
private double numero2;
public Numeros(double n1,double n2)
{
numero1=n1;
numero2=n2;
}
{
return numero1*numero2;
}
3) Crear la clase Alumno que tenga como atributos nombre, nota1 y nota2 y permita
calcular el promedio y su condicion (aprobado o desaprobado)
import java.io.*;
class Alumno{
private String nombre;
private double nota1;
private double nota2;
if(promedio()>=10.5)
return "aprobado";
else
return "desaprobado";
}
4) Crear la clase Trabajador que tenga como atributos nombre, preciHora y horasTrabajadas
y se calcule salario Bruto, impuestos( 10% del Salario Bruto) y salario Neto (Salario Bruto
– Impuestos)
import java.io.*;
class Trabajador{
private String nombre;
private double horasTrabajadas;
private double precioHora;
return 0.10*salarioBruto();
}
5) Crear la clase Móvil con atributos velocidad Inicial, aceleración y tiempo y se pueda
calcular el espacio recorrido por el móvil
import java.io.*;
class Movil{
class Alpha {
private int x;
private void privateMethod() {
System.out.println("privateMethod");
}
}
Protected
Permite que las clases, subclases y todas las clases del mismo paquete puedan acceder a sus
miembros.
Public
Cualquier clase en cualquier paquete tienen acceso a miembros publicos de las clases.
Ejm:
package Greek;
import Greek.*;
class Beta {
void accessMethod() {
Alpha a = new Alpha();
a.iampublic = 10; // legal
a.publicMethod(); // legal
}
}
Package
El nivel de acceso package es el que se obtiene si no se coloca explícitamente otros
niveles de acceso. Este nivel de acceso permite a las clases en el mismo paquete como su
clases acceder a los miembros. Este nivel de acceso asume que clases en el mismo paquete
son amigas de confianza.
Ejemplo:
package Greek;
class Alpha {
int iampackage;
void packageMethod() {
System.out.println("packageMethod");
}
}
Supongan que Alpha y Beta fueron declaradas como parte del paquete Greek Package
package Greek;
class Beta {
void accessMethod() {
Alpha a = new Alpha();
a.iampackage = 10; // legal
a.packageMethod(); // legal
}
}
La referencia this
Cada objeto tiene acceso a una referencia a si mismo, llamada referencia this.
La referencia this se usa explícitamente para referirse tanto a los atributos como a los
metodos de un objeto.
Ejemplo:
class Numero{
private int x;
public Numero(int x)
{
this.x = x;
}
public void setX(int x)
{
this.x = x;
}
public String toString()
{
Return “x = “+this.x;
}
}
Ejemplo:
import java.io.*;
class Empleado{
private String nombres;
private String apellidos;
private static int contador;
return apellidos;
}
Herencia
A través de la herencia, una clase nueva hereda los atributos y métodos de una superclase
previamente definida. En este caso decimos que la nueva clase es una subclase.
En la herencia simple, una clase se hereda de una superclase. Java no reconoce la herencia
múltiple, pero si maneja el concepto de interfaces. Las interfaces ayudan a java a lograr
muchas de las ventajas de la herencia múltiple.
Una subclase normalmente agrega sus propios atributos y métodos. De modo que una
subclase generalmente es mayor que su superclase. Una subclase es más específica que su
superclase y representa un grupo más pequeño de objetos. El verdadero valor de la herencia
radica en la capacidad de definir en la subclase adiciones a las características heredadas de
la superclase o sustituciones de estas.
Todo objeto de una subclase es también un objeto de la superclase de esa subclase. Sin
embargo no se cumple lo opuesto: los objetos de una superclase no son objetos de las
subclases de esa superclase.
Las relaciones de herencia forman estructuras jerárquicas similares a un árbol. Una
superclase existe en una relación Jerárquica con sus subclases. Sin duda, una clase puede
existir sola, pero es cuando una clase se emplea con el mecanismo de herencia que se
convierte ya sea en una superclase que proporciona atributos y comportamientos a otras
clases, o en una subclase que hereda dichos atributos y comportamientos.
Ejemplos:
Persona
Por ejemplo en una ciudad existen Personas las cuales pueden ser Empleados, Estudiantes,
Religiosos. Los Empleados pueden ser Profesor, Contador. Los estudiantes pueden ser
Universitarios, de Institutos y Colegios.
Miembros Protected
Los miembros protected de una superclase sólo están accesibles para los métodos de la
superclase, los métodos de las subclases y los métodos de otras clases del mismo paquete.
Relacion entre Objetos de superclase y objetos de subclase
Un objeto de una subclase se puede tratar como objeto de su superclase correspondiente.
Esto hace posible ciertas manipulaciones interesantes. Por ejemplo, a pesar del hecho de
que los objetos de diversas clases derivadas de una superclase en particular pueden ser muy
diferentes entre sí, podemos crear un arreglo de ellos, en tanto los tratemos como objetos de
import java.io.*;
class Punto{
protected double x;
protected double y;
public Punto()
{
x=0;
y=0;
}
}
}
public Circulo()
{
super();
radio=0;
}
P=C;
System.out.println("Circulo via Punto"+P);
// Si se trabaja con P para calcular el area primero debemos
// Convertir P a tipo Circulo.
System.out.println("Area del Circulo : "+((Circulo)P).area());
}
}
La palabra clave extends (extiende) de la definición de clase indica herencia. Todos los
miembros (no private) de la clase Punto se heredan en la clase Circulo.
Los constructores de Circulo deben invocar al constructor de Punto para inicializar la
porción de superclase de un objeto de la clase Circulo. La primer línea del cuerpo de cada
constructor invoca al constructor de Punto mediante la referencia a super.
Una subclase pude redefinir un método de superclase empleando el mismo nombre, esto se
denomina supeditar un método de superclase. Se puede usar la referencia super seguida por
el operador punto para acceder a la versión de superclase de ese método desde la subclase.
En el ejemplo anterior la clase Circulo supedita el método toString() de la clase Punto.
Clases Abstractas
Java proporciona un tipo especial de clase, llamada clase abstracta, que pueden ayudar a la
organización de clases basadas en métodos comunes. Una clase abstracta permite colocar
los nombres de los métodos comunes en una sola clase (sin tener que escribir el código que
los implemente). Después, al crear nuevas clases, éstas pueden derivar de una clase
abstracta que contiene una serie de métodos requeridos.
Los métodos abstractos contienen sólo el nombre del método seguido de una lista de
parámetros. No contiene el código que implementa el método (esto se deja para las clases
derivadas.
• Las clases que contienen métodos abstractos se conocen como clases abstractas
• Un programa no puede crear instancias de una clase abstracta de forma directa, es
necesario crear instancias de sus subclases.
• Las clases abstractas pueden contener una mezcla de métodos abstractos y no
abstractos (concretos). Los métodos concretos contienen la instrumentación del
método
• Cualquier subclase que extienda a la clase abstracta debe proporcionar la
instrumentación de todos los métodos abstractos. En caso contrario, la subclase
misma se convierte en clase abstracta.
Por ejemplo, las siguientes instrucciones definen una clase abstracta llamada
InsectosVoladores:
La clase abstracta tiene un método sin implementación. Al crear la clase Abeja , se debe
implementar el método. Como se ve, las clases abstractas en cierta forma obligan a crear y
utilizar los métodos que definen.
Polimorfismo
Ejemplos:
import java.io.*;
{
salarioPorPieza = sp;
}
E = J;
System.out.println(E.toString()+" gano "+E.ganancias());
E = C;
System.out.println(E.toString()+" gano "+E.ganancias());
E = H;
System.out.println(E.toString()+" gano "+E.ganancias());
E = D;
System.out.println(E.toString()+" gano "+E.ganancias());
}
}
/*
La Linea
E = J;
La expresion :
E.toString()
La llamada al Metodo
E.ganancias()
invoca al metodo ganancias del objeto al que E hace referencia. El sistema invoca el
método ganancias del objeto de la subclase en lugar del metodo ganancias de la superclase.
Esto es otro ejemplo de ligado dinamico de metodos.
EJERCICIO
Se desea calcular el área y el perímetro del cuadrado, rectángulo y triángulo usando clases
abstractas y polimorfismo.