Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modulo Desarrollo de Aplic Orientada A Obj - Sist III
Modulo Desarrollo de Aplic Orientada A Obj - Sist III
SUPERIOR “ISABEL LA
CATOLICA”
DESA
RRO
LLO
MÓDULO
INFORMATIVO
2020
DOCENTE
MANUEL TRUJILLO F.
CONTENIDO
CAPITULO I: LENGUAJE DE PROGRAMACIÓN JAVA NETBEANS Y LAS
DIFERENTES ESTRUCTURAS DE PROGRAMACIÓN LINEALES................................3
1. CONSTANTES...............................................................................................................4
1.1. Constantes literales.................................................................................................4
1.2. Constantes declaradas............................................................................................4
1.3. Constantes expresión..............................................................................................5
2. VARIABLES..................................................................................................................5
2.1. Declaración de variables........................................................................................5
2.2. Iniciación de variables............................................................................................5
2.3. Utilización de variables..........................................................................................6
2.4. Diferencias entre ambas.........................................................................................6
3. ESTRUCTURAS SECUENCIALES DE PROGRAMACIÓN...................................7
4. ESTRUCTURAS CONDICIONALES SIMPLES Y DOBLES...................................8
4.1. Simples:...................................................................................................................8
4.2. Dobles:.....................................................................................................................9
5. ESTRUCTURAS CONDICIONALES ANIDADAS Y MÚLTIPLES........................9
5.1. Condicionales anidadas:.........................................................................................9
5.2. Condiciones múltiples:.........................................................................................10
6. ESTRUCTURAS REPETITIVAS O BUCLES..........................................................10
6.1. La estructura repetitiva for.................................................................................11
6.2. LA ESTRUCTURA REPETITIVA WHILE......................................................13
6.3. LA ESTRUCTURA REPETITIVA DO - WHILE.............................................15
CAPITULO II: ARREGLOS O ARRAYS Y SUS DISTINTOS MÉTODOS EN JAVA
NETBEANS..............................................................................................................................17
1. Array o arreglo unidimensional..................................................................................17
1.1. Inicializando un array unidimensional en Java..................................................17
1.2. Asignación de valores en un array unidimensional en Java..............................18
2. Array (arreglo) multidimensional en Java.................................................................21
2.1. Inicializar un array multidimensional en Java...................................................21
2.2. Llenado de un array multidimensional en Java.................................................22
2.3. Longitud de un array...........................................................................................24
2.4. La clase Arrays.....................................................................................................24
3. MÉTODOS DE ORDENAMIENTO EN ARREGLOS.............................................26
3.1. Método de la burbuja...........................................................................................26
3.2. Método por selección:...........................................................................................27
2
3.3. Método por inserción:..........................................................................................29
4. MÉTODOS DE BÚSQUEDA EN ARREGLOS.........................................................31
4.1. Búsqueda binaria..................................................................................................31
4.2. Búsqueda secuencial.............................................................................................33
CAPITULO III: PROGRAMACION ORIENTADA A OBJETOS EN JAVA...................35
1. Clases.............................................................................................................................36
2. OBJETOS.....................................................................................................................37
3. OTROS CONCEPTOS DE LA PROGRAMACION ORIENTADA A OBJETOS.40
3.1. Constructores y destructores...............................................................................40
3.1.1. Constructor.......................................................................................................41
3.1.2. Destructor..........................................................................................................42
3.2. Encapsulación.......................................................................................................49
3.3. Herencia................................................................................................................51
3.4. Polimorfismo.........................................................................................................64
3
CAPITULO I: LENGUAJE DE PROGRAMACIÓN JAVA
NETBEANS Y LAS DIFERENTES ESTRUCTURAS DE
PROGRAMACIÓN LINEALES
1. CONSTANTES
Una constante es un dato cuyo valor no puede cambiar durante la ejecución del
programa. Recibe un valor en el momento de la compilación y este permanece
inalterado durante todo el programa.
Min = 0;
Max = 100;
Sep = 10;
También llamadas constantes con nombre, son las que se declaran asignándoles
un valor directamente. Por ejemplo:
4
Min = 0; (* entero *)
Min = 0;
Max = 100;
Intervalo = 10;
N = (Max - Min) / Intervalo;
2. VARIABLES
5
Esto no es más que darle un valor inicial a una variable. Así como lo primero
que se hace con una variable es declararla, lo siguiente tiene que ser iniciarla.
Esto se hace para evitar posibles errores en tiempo de ejecución, pues una
variable tiene un valor indeterminado después de declararla.
I =1;
readln(n);
while i < n do begin
(* cuerpo del bucle *)
i=i+1
Incrementar su valor:
i=i+1
Controlar un bucle:
for i=1 to 10 do ...
Chequear una condición:
if i<10 then ...
Participar en una expresión:
n = (Max - Min) div i
Después de haber visto cada una por separado, pasemos a explicar las
diferencias que existen entre constantes y variables. A primera vista pudieran
parecer conceptos similares, pero realmente son cosas muy distintas. Y esta
6
distinción viene dada por la posibilidad que tienen las variables para cambiar de
valor.
Principales diferencias:
Ejemplo de programa Java con estructura secuencial: Programa que lee dos
números por teclado y los muestra por pantalla.
7
/* Programa que lea dos números por teclado y los muestre por
pantalla.
*/
import java.util.*;
public class Main {
public static void main(String[] args){
//declaración de variables
int n1, n2;
Scanner sc = new Scanner(System.in);
//leer el primer número
System.out.println("Introduce un número entero: ");
n1 = sc.nextInt(); //lee un entero por teclado
//leer el segundo número
System.out.println("Introduce otro número entero: ");
n2 = sc.nextInt(); //lee un entero por teclado
//mostrar resultado
System.out.println("Ha introducido los números: " + n1 + " y " +
n2);
}
}
4.1. Simples:
La estructura condicional más simple en Java es el if, se evalúa una condición y
en caso de que se cumpla se ejecuta el contenido entre las llaves {} o en caso de
que se omitan se ejecuta el código hasta el primer «;» por lo tanto si no se usan
los {} la condición aplica solo a la siguiente instrucción al if.
If (condicion) {
ejecutar();
}
8
if (condicion)
ejecutar();
// Y mas compacto
if (condicion) ejecutar();
Por lo tanto, el uso de las llaves es opcional cuando dentro de la condición hay
una sola línea de código, pero puede generar errores si se añade más código que
se espere que se ejecute bajo la condición si no recordamos que tenemos que
añadir las llaves en estos casos. Personalmente, prefiero usar las llaves y en caso
de no utilizarlas pondría el if completo en una única línea para que sea más claro
que la condición solo aplica a esa línea.
4.2. Dobles:
Con el if solo podemos hacer que se ejecute un fragmento de código o no pero
en el caso de que no se cumpla la condición no se hace nada (sigue el flujo
normal de ejecución) por lo que si queremos que se ejecute otra cosa cuando no
se cumpla la condición solo con el if tenemos que hacer otro con la condición
inversa provocando que se tenga que comprobar la condición 2 veces mientras
que si usamos el else solo necesitamos hacer la comprobación una sola vez.
9
System.out.println("A la playa!!!");
} else {
System.out.println("A la montaña!!!");
}
} else if (temperatura < 5) {
if (nevando) {
System.out.println("A esquiar!!!");
}
} else {
System.out.println("A descansar... zZz");
}
Con el switch se puede hacer un control del tipo if else if… más estructurado,
pero en realidad no exactamente igual puesto que con el switch lo que se hace es
definir un conjunto de casos que van a tener una ejecución distinta y se ejecutará
el caso que coincida con el valor indicado en el switch.
switch (variable) {
case valor_1:
case valor_2:
// Ejecutar si el valor de variable es igual a valor_1 o a valor_2
ejecutarA();
break; // Salir del switch
case valor_3:
// Ejecutar si el valor de variable es igual a valor_3
ejecutarB();
break; // Salir del switch
default:
// Ejecutar si el valor de varible es distinto del del resto de
casos
ejecutarC();
break; // Salir del switch
}
10
6. ESTRUCTURAS REPETITIVAS O BUCLES
Esta vez vamos a ver cómo se utiliza las estructuras de control repetitivas en Java
(también conocidas como ciclos o bucles). Como mencionaba en el tutorial
Estructuras de control condicionales vamos a necesitar de estas estructuras al
momento de programar, y pues bueno este tipo de estructuras de control se las
utiliza cuando necesitamos recorrer un conjunto de datos, por ejemplo, al leer un
archivo, al leer registros de una base de datos, en fin, en todos los problemas en los
que se tenga que hacer iteraciones, bucles, siempre vamos a necesitar de estas
estructuras.
for(variable_inicializacion;condicion;incremento)
{
//instrucciones
}
11
La tercera parte es el incremento o decremento y le indica en pasos de
cuanto debe incrementarse o decrementarse la variable de inicialización en
cada iteración, por lo general es de uno en uno, pero todo dependerá del
problema que se quiera resolver, también puede omitirse esta parte, si se lo
hace el ciclo se vuelve infinito (no siempre).
Ahora un ejemplo
Imprimir por consola los números enteros desde el 2 hasta 20
Este es un problema sencillo que se lo puede resolver utilizando el ciclo
for:
6.1.2. Proceso
La variable i es declarada en inicializada en 2 (también se la puede
declarar en inicializar fuera y omitir esa parte).
Seguido de esto el compilador verifica si la variable i es menor a 21, si es
correcto continúa el ciclo, ejecuta la (s) instrucciones y luego.
La variable i se incrementa en 2.
El compilador repite las mismas instrucciones desde el paso 2 hasta que i
toma el valor de 22, la condición se verifica y como no se cumple, el ciclo
termina.
El ciclo for puede tomar varias sintaxis sin que esto genere errores de
compilación o cambie el resultado del programa. A continuación, se
muestra algunas sintaxis con las que nos podemos encontrar.
Ahora el mismo ejemplo anterior lo adaptamos a esta sintaxis, como se
puede ver la variable de incremento se omite y se la pone dentro del ciclo,
luego de las instrucciones.
12
public class TestCiclos {
public static void main(String[] args) {
for (int i = 2; i < 21;) {
System.out.println("Número: " + i);
i += 2;
}
}
}
Nota: En este caso la variable i es visible sólo dentro del ciclo for, puesto
que se la ha declarado e inicializado dentro del ciclo, si la quisiéramos
utilizar fuera, nos va lanzar un error.
while (condicion) {
//instrucciones
}
13
Nota importante: Este ciclo se utiliza cuando no sabemos el número de veces
exacto que se ejecutará el ciclo.
Si la condición siempre es verdadera o siempre se cumple este ciclo puede crear
un bucle que nunca termine, por eso hay que tener en cuenta que en algún
momento del ciclo la condición no debe cumplirse (debe volverse falsa) para que
el ciclo termine, caso contrario el ciclo se vuelve infinito.
A continuación, el código.
import java.util.Scanner;
try {
numero = entrada.nextInt();
while ((numero % 10) != 0) {
numero++;
}
System.out.println("La decena superior es: " +
numero);
} catch (Exception e) {
System.out.println("Número no válido");
14
}
}
}
do {
//instrucciones
} while (condicion);
15
Obtener los dígitos de un número ingresado por teclado, ejemplo 100, tiene 3
dígitos.
Una forma para obtener los dígitos que tiene un número, realizamos divisiones
sucesivas entre 10 hasta que el número se vuelve cero (del resultado de la
división sólo se debe tomar la parte entera), para obtener el número de dígitos
contamos las veces que se ha dividido. Por ejemplo, tenemos el número 345:
El resultado debe ser almacenado en una variable de tipo entero.
345/10=34
34/10=3
3/10=0
También hubiésemos podido utilizar el ciclo while que funciona con todos los
números, menos con el número 0 (cero), no entra en el ciclo porque número es
igual que cero y por ende la respuesta va ser:
16
Esto se soluciona con el ciclo do while que me garantiza que por lo menos el ciclo
se va ejecutar una vez, con esto, si se ingresa el número cero va ingresar al ciclo ya
que la condición se verifica al final.
Nota importante: Este ciclo se utiliza cuando sabemos que se ejecutará el ciclo al
menos una vez.
Un array (o arreglo) unidimensional solo presenta una sola fila, también otros la
llaman vectores de una dimensión.
Existen múltiples maneras de aplicar estos arrays en Java, por ejemplo, si queremos
guardar las calificaciones de un conjunto alumnos podríamos utilizar un array
unidimensional para generar sus notas de aprobación, etc.
Sintaxis
tipo nombre[];
17
1.1. Inicializando un array unidimensional en Java
Los arrays unidimensionales se pueden inicializar las veces que queramos, pero
debemos tomar en cuenta que cuando hacemos esto perdemos todo el
contenido del array guardado.
calificaciones[2]=71;
int calificaciones[] = {33, 21, 71};
int calificaciones[]= new int[] {33,21,71};
18
Estos arrays unidimensionales también pueden ser igualados a otro array para
que tenga los mismos valores, pero deben cumplir la condición que sean del
mismo tipo.
int notas[];
int ejemplo[]=new int[10];
notas=ejemplo;
Ejemplo de un array (arreglo) unidimensional en Java
import java.util.Scanner;
/**
*
* @author Creatividad Codificada
*/
public class ArrayUnidimensional
{
public static void main(String[] args)
{
Scanner t = new Scanner (System.in);
int dim;
int notas[];
System.out.print("DIGITE LA DIMENSION DEL ARRAY NOTAS: ");
dim=t.nextInt();
notas = new int [dim];
System.out.println("INTRODUZCA LOS VALORES DEL ARRAY");
for (int k=0;k<dim;k++)
{
System.out.print("notas [ "+ k + "] = ");
notas[k]=t.nextInt();
}
// Ordenamos el array
19
int aux;
for (int i=0;i<dim;i++)
for (int j=0;j<dim-1;j++)
{
if (notas[j]>notas[j+1])
{
aux = notas[j];
notas[j]=notas[j+1];
notas[j+1]=aux;
}
}
notas [ 0] = 78
notas [ 1] = 71
notas [ 2] = 88
notas [ 3] = 65
20
notas [ 4] = 45
notas [ 5] = 51
notas [ 6] = 16
ARRAY ORDENADO
notas [ 0 ] = 16
notas [ 1 ] = 45
notas [ 2 ] = 51
notas [ 3 ] = 65
notas [ 4 ] = 71
notas [ 5 ] = 78
notas [ 6 ] = 88
Estos arrays manejan dos o más dimensiones, esto quiere decir que puede haber un
array que contenga otro array.
Para entender mejor imagínense un cubo de Ruby donde cada cuadradito guardara
un valor del array o arreglo y si hablamos de tamaño un cubo Ruby sería un array
de 3x3x3.
21
Sintaxis
int notas[][];
2.1. Inicializar un array multidimensional en Java
22
public static void main(String[] args) {
Scanner en = new Scanner (System.in);
byte dim = 3; // DIMENSION DE LA MATRIZ
int aux = 0;
int matriz[][] = new int [dim][dim];
System.out.println("SUMA DE LA DIAGONAL PARA UNA MATRIZ
CUADRADA");
System.out.println("TECLEE LOS NÚMEROS DE LA MATRIZ");
for(int i=0 ; i<matriz.length ; i++)
{
for(int j=0; j<matriz.length; j++)
{
System.out.print("matriz["+i+"]"+"["+j+"] = ");
matriz[i][j]=en.nextInt();
}
}
for(int k=0 ; k<matriz.length ; k++)
{
for(int l=0; l<matriz.length; l++)
{
if (k==l)
{
aux = aux + matriz[k][l];
System.out.print(matriz[k][l] + "\t");
}
else System.out.print(matriz[k][l] + "\t");
}
System.out.println();
}
System.out.println("LA SUMA DE LA DIAGONAL ES: "+aux);
23
}
}
Resultado
SUMA DE LA DIAGONAL PARA UNA MATRIZ CUADRADA
TECLEE LOS NÚMEROS DE LA MATRIZ
matriz[0][0] = 15
matriz[0][1] = 48
matriz[0][2] = 75
matriz[1][0] = 65
matriz[1][1] = 85
matriz[1][2] = 24
matriz[2][0] = 35
matriz[2][1] = 46
matriz[2][2] = 67
15 48 75
65 85 24
35 46 67
LA SUMA DE LA DIAGONAL ES: 167
24
Esta clase estática es muy útil cuando necesitamos obtener o realizar algunas
operaciones específicas, si la deseamos usar se ubica dentro el paquete
conocido como java.utils.
1) Método fill
El método fill nos permite llenar todo el array, pero de una dimensión con
algún valor que le indiquemos, el array debe estar seguido del valor que
deseamos rellenar en todo el array, esto lo declaramos en los argumentos del
método fill.
2) Método equals
El método equals de Java compara dos arrays o arreglos, este método nos
devuelve “true” si son exactamente iguales los dos arrays, es decir deben
tener el mismo tipo de dato, tamaño y sus valores deben ser iguales, en caso
de no ser así nos devolverá falso, con esto simplificamos la forma de
establecer si son iguales dos arrays (arreglos).
Arrays.equals(array1 , array2)
3) Método sort
int v[]={10,6,7,12,1,4,9,11,8,3};
Arrays.sort(v);//Estará ordenado
25
Arrays.sort(v,2,8);//Ordena del segundo al octavo elemento del
array
4) System.arraysCopy
arraycopy(Object ob, int iniPos, Object destino, int destPos, int tamanio)
int array1[]={0,5,8,9,11};
int array2[]={4,8,6,0,1,2,4,7,9,6};
System.arraycopy(array1, 0, array2, 0, array1.length);
for (int i=0;i<=9;i++){
System.out.print(array2[i]+" ");
} //Imprime 0 5 8 9 11 2 4 7 9 6
26
el final del array están ya ordenados. Si los elementos adyacentes están
desordenados se intercambian.
27
a[1]. De este modo, los elementos a[0] y a[1] están ordenados y la sublista a[2],
a[3]... a[n-1] desordenado; entonces, se selecciona el elemento más pequeño y
se intercambia con a[2].
28
/*
*/
29
Algoritmo de ordenación por inserción
elemento.
menor o mayor.
3. Por cada bucle o iteración i (desde i=1 hasta n-1) se explora la sublista a[i-1]
...
30
La codificación del algoritmo se realiza en el método ordInsercion(). Se pasa
como argumento
con el atributo del array length. Los elementos del array son de tipo entero; en
realidad, pueden
31
4.1. Búsqueda binaria
El proceso se repite hasta que se encuentre el valor buscado, o bien hasta que el
intervalo de búsqueda sea nulo, lo que querrá decir que el elemento buscado
NO FIGURA en la matriz.
32
// del valor. Si el valor no se localiza, devuelve -1
if (matriz.length == 0) {
return -1;
}
do {
mitad = (inferior + superior) / 2;
if (valorBuscado > matriz[mitad]) {
inferior = mitad + 1;
} else {
superior = mitad – 1;
}
} while (matriz[mitad] != valorBuscado && inferior <= superior);
if (matriz[mitad] == valorBuscado) {
return mitad;
} else {
return -1;
}
}
}
4.2. Búsqueda secuencial
33
en caso de ser verdadera la comparación, guardar la posición el elemento o
dato.
He aquí el código:
public int busquedaSecuencial(int []arreglo,int dato){
int posicion = -1;
for(int i = 0; i < arreglo.length; i++){//recorremos todo el arreglo
if(arreglo[i] == dato){//comparamos el elemento en el arreglo con el
buscado
posicion = i;//Si es verdadero guardamos la posicion
break;//Para el ciclo
}
}
return posicion;
}
Este método nos halla la posición del elemento o dato buscado, pero en su
primera coincidencia, si queremos que nos halle la posición de la última
coincidencia, lo único que tenemos que hacer es eliminar la línea donde
aparece 'break'.
34
Ahora cabe la pregunta, ¿y si el elemento que deseo buscar aparece varias
veces en el arreglo y yo deseo conocer cada una de estas posiciones, como
hago?
He aquí el código:
35
Agiliza el desarrollo de software.
Facilita el trabajo en equipo.
1. Clases
En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por
ejemplo, nuestro teléfono móvil es sólo uno de los miles que hay en el mundo. Si
hablamos en términos de la programación orientada a objetos, podemos decir que
nuestro objeto móvil es una instancia de una clase conocida como “móvil”. Los
móviles tienen características (marca, modelo, sistema operativo, pantalla, teclado,
etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes multimedia,
transmisión de datos, etc.).
Cuando se fabrican los móviles, los fabricantes aprovechan el hecho de que los
móviles comparten esas características comunes y construyen modelos o plantillas
comunes, para que a partir de esas se puedan crear muchos móviles del mismo
modelo. A ese modelo o plantilla le llamamos clase, y a los equipos que sacamos a
partir de ella la llamamos objetos.
Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del
mismo tipo y mismas características.
Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En
realidad, no existe diferencia entre un objeto y una instancia. Sólo que el objeto es
36
un término más general, pero los objetos y las instancias son ambas
representaciones de una clase.
2. OBJETOS
37
Todo objeto del mundo real tiene 2 componentes: variables de clase y métodos.
Por ejemplo, los automóviles pueden tener como variables de clase (marca,
modelo, color, velocidad máxima, etc.) y como métodos (frenar, acelerar,
retroceder, llenar combustible, cambiar llantas, etc.).
Los objetos de Software, al igual que los objetos del mundo real, también tienen
variables de clase y métodos. Un objeto de software mantiene sus características
en una o más “variables”, e implementa su comportamiento con “métodos”. Un
método es una función o subrutina asociada a un objeto.
Imaginemos que tenemos aparcado en el garaje un Ford Focus color azul que
corre hasta 260 km/h. Si pasamos ese objeto del mundo real al mundo del
software, tendremos un objeto Automóvil con sus características
predeterminadas:
Marca = Ford
Modelo = Focus
Color = Azul
Por lo tanto, dentro de una clase tendremos como variables de clase las
características descritas anteriormente y como métodos tendremos en este caso
concreto (frenar, acelerar, retroceder, llenar combustible, etc.…).
38
class Automovil {
// VARIABLES DE CLASE
private String marca;
private String modelo;
private String color;
private String velocidadMaxima;
39
this.modelo = modelo;
}
40
a menudo. Sobre todo, en el caso de los constructores, ya que los destructores
no se suelen usar más que en contadas ocasiones.
3.1.1. Constructor
Un método constructor de una clase es un método especial que:
tiene el mismo nombre que la clase y
no tiene tipo de retorno.
inicializa el estado de un objeto.
La sintaxis para la declaración de un método constructor es:
[atributos] [modificadores] <identificador> ( [parámetros] )
[inicializador]
{
// Cuerpo del constructor.
}
Donde:
atributos (opcional) es información declarativa adicional.
modificadores (opcional) se restringen a extern y a los modificadores de
acceso.
identificador es el nombre del método constructor (igual al nombre de la
clase).
parámetros (opcional) es la lista de parámetros pasados al constructor.
inicializador (opcional). Con el inicializador, el constructor invoca
previamente a otro constructor.
El inicializador puede ser uno de los siguientes:
· base([listaDeParámetros])
· this([listaDeParámetros])
Cuerpo del constructor es el bloque de programa que contiene las
instrucciones para inicializar la instancia de clase (objeto).
41
Ejemplo:
class Producto
{
private int clave;
private double precio;
public Producto( int c, double p)
{
clave = c;
precio = p;
}
public double daPrecio( )
{
return precio;
}
}
3.1.2. Destructor
En contraposición al constructor, el destructor elimina el vínculo y libera
el espacio de memoria de un objeto, para que pueda ser ocupado
nuevamente.
Notas:
Una clase solamente puede tener un destructor.
Los destructores no pueden heredarse o sobrecargarse.
Los destructores no pueden invocarse, sino que son invocados
automáticamente.
42
Un destructor no acepta modificadores ni parámetros. Por
ejemplo, la siguiente es una declaración de un destructor para la
clase Figura:
~ Figura()
{
// Instrucciones para limpiar.
}
Ejemplo:
// Destructores.cs : Maneja tres destructores de clases encadenadas.
using System;
using C = System.Console;
class Primera
{
~ Primera( )
{
C.WriteLine("Se invocó al destructor de Primera...");
43
}
}
class Segunda : Primera
{
~ Segunda( )
{
C.WriteLine("Se invocó al destructor de Segunda...");
}
}
class Tercera : Segunda
{
~ Tercera( )
{
C.WriteLine("Se invocó al destructor de Tercera...");
}
}
public class Principal
{
public static void Main( )
{
Tercera t = new Tercera ( );
}
}
44
Cuando el programador define un constructor, el predeterminado se
anula. En caso de requerir el constructor predeterminado junto con un
constructor definido por el programador, deberá volverse a escribir el
constructor predefinido, de acuerdo al siguiente formato :
public <nombreClase>( )
{
}
Ejemplo 1
// Uso del constructor predeterminado.(No se define otro constructor)
using System;
using C = System.Console;
class Persona
{
private string nombre;
private int edad;
public void asignaNombre( string n)
{
nombre = n;
}
public void asignaEdad( int e)
{
edad = e;
}
public string daNombre( )
{
return nombre;
}
public int daEdad( )
{
return edad ;
}
45
}
public class Principal
{
public static void Main( )
{
Persona p = new Persona( ) ; // Se invoca al constructor
//predeterminado.
p.asignaNombre("Luis");
p.asignaEdad(25);
C.WriteLine("Nombre: {0} , Edad: {1}", p.daNombre(),
p.daEdad());
}
}
Ejemplo 2
// Uso de un constructor con dos parámetros.(No se requiere un
constructor predefinido)
using System;
using C = System.Console;
class Persona
{
private string nombre;
private int edad;
public Persona( string n, int e)
{
nombre = n;
edad = e;
}
public string daNombre( )
{
return nombre;
}
46
public int daEdad( )
{
return edad ;
}
}
public class Principal
{
public static void Main( )
{
Persona p = new Persona( "Luis", 25) ;
C.WriteLine("Nombre: {0} , Edad: {1}", p.daNombre(),
p.daEdad());
}
}
Ejemplo 3
// Uso de un constructor con dos parámetros y el constructor
predefinido.
using System;
using C = System.Console;
class Persona
{
private string nombre;
private int edad;
public Persona(string n, int e)
{
nombre = n;
edad = e;
}
public Persona() // Constructor predeterminado, vuelto a escribir.
{
}
47
public string daNombre()
{
,.....return nombre;
}
public int daEdad()
{
.....return edad;
}
public void asignaNombre(string n)
{
.....nombre = n;
}
public void asignaEdad(int e)
{
...edad = e;
}
}
public class Principal
{
public static void Main()
{
Persona pa = new Persona("Luis", 25);
Persona pb = new Persona(); // Se invoca al constructor
................................................// predeterminado
pb.asignaNombre("Pepe");
pb.asignaEdad(19);
C.WriteLine("Nombre: {0} , Edad: {1}", pa.daNombre(),
pa.daEdad());
C.WriteLine("Nombre: {0} , Edad: {1}", pb.daNombre(),
pb.daEdad());
C.Read();
}
48
}
3.2. Encapsulación
Imaginemos que se crea una clase, una docena de programadores tienen acceso
a dicha clase y la utilizan a discreción, posteriormente dicha clase comienza a
comportarse de una manera inesperada debido a que los valores que algunas
variables han tomado no fueron anticipados y todo comienza a desmoronarse.
Para corregir el problema se crea una versión más nueva de dicha clase y listo.
49
de una instancia de la clase MiClase, esto compila sin ningún problema,
digamos que es 'legal', sin embargo, ¿qué pasa si ingresamos un valor que no se
supone debe de tener una variable (en este caso el -5 que le asignamos a tipo)?,
simplemente no hay nada que nos detenga para hacerlo. La única manera de
proteger el código es escribiendo un método que nos permita regular los
valores que cada variable puede tener y escondiendo las variables para que no
se pueda acceder a ellas de manera directa, esto es el principio básico de
encapsulamiento.
Hacer métodos de acceso públicos para forzar al acceso a las variables por
medio de dichos métodos en lugar de acceder directamente.
Utilizar las convenciones de código para los nombres de los métodos, p. ej., set
y get.
50
Si nos fijamos un poquito, en el método setTipo() no existen validaciones para
prevenir que un valor no válido sea asignado a la variable, sin embargo, el
proveer de un método de este tipo desde el diseño inicial de la aplicación nos
permite posteriormente modificar el comportamiento de la misma sin afectar
los métodos utilizados, tal vez en un futuro se desee que dicha variable
solamente pueda tener uno entre un rango de valores y se podrán aplicar
posteriormente los cambios sin que haya repercusiones negativas.
3.3. Herencia
La herencia es uno de los conceptos más cruciales en la POO. La herencia
consiste en que una clase puede heredar las variables y los métodos de otra
clase (la clase que hereda es llamada superclase o clase padre). Esto significa
51
que una subclase, aparte de los atributos y métodos propios, tiene incorporados
los atributos y métodos heredados de la superclase. De esta manera se crea una
jerarquía de herencia.
}
Como puedes ver en este caso estamos haciendo que la clase Coche herede de
la clase Automovil.
52
double altura;
void mostrarDimension(){
System.out.println("La base y altura es: "+base+" y "+altura);
}
}
//Una subclase de DosDimensiones para Triangulo
class Triangulo extends DosDimensiones{
String estilo;
double area(){
return base*altura/2;
}
void mostrarEstilo(){
System.out.println("Triangulo es: "+estilo);
}
}
class Lados3{
public static void main(String[] args) {
Triangulo t1=new Triangulo();
Triangulo t2=new Triangulo();
t1.base=4.0;
t1.altura=4.0;
t1.estilo="Estilo 1";
t2.base=8.0;
t2.altura=12.0;
t2.estilo="Estilo 2";
System.out.println("Información para T1: ");
t1.mostrarEstilo();
t1.mostrarDimension();
System.out.println("Su área es: "+t1.area());
53
System.out.println();
System.out.println("Información para T2: ");
t2.mostrarEstilo();
t2.mostrarDimension();
System.out.println("Su área es: "+t2.area());
}
}
Salida:
Información para T1:
Triangulo es: Estilo 1
La base y altura es: 4.0 y 4.0
Su área es: 8.0
54
subclase incluye a todos los miembros de su superclase, no puede acceder
a los miembros de la superclase que se han declarado privados.
Ejemplo:
55
Recuerde que un miembro de la clase que ha sido declarado
[java]private[java] seguirá siendo privado para su clase. No es accesible
por ningún código fuera de su clase, incluidas las subclases.
56
return getBase()*getAltura()/2;
}
void mostrarEstilo(){
System.out.println("Triangulo es: "+estilo);
}
}
class Lados3{
public static void main(String[] args) {
Triangulo t1=new Triangulo();
Triangulo t2=new Triangulo();
t1.setBase(4.0);
t1.setAltura(4.0);
t1.estilo="Estilo 1";
t2.setBase(8.0);
t2.setAltura(12.0);
t2.estilo="Estilo 2";
System.out.println("Información para T1: ");
t1.mostrarEstilo();
t1.mostrarDimension();
System.out.println("Su área es: "+t1.area());
System.out.println();
System.out.println("Información para T2: ");
t2.mostrarEstilo();
t2.mostrarDimension();
System.out.println("Su área es: "+t2.area());
}
}
Salida:
Información para T1:
57
Triangulo es: Estilo 1
La base y altura es: 4.0 y 4.0
Su área es: 8.0
Constructores y herencia
En una jerarquía, es posible que tanto las superclases como las subclases
tengan sus propios constructores. Esto plantea una pregunta importante:
¿qué constructor es responsable de construir un objeto de la subclase, el de
la superclase, el de la subclase o ambos? La respuesta es esta: el
constructor para la superclase construye la porción de la superclase del
objeto, y el constructor para la subclase construye la parte de la subclase.
58
private double base;
private double altura;
//Métodos de acceso para base y altura
double getBase(){return base;}
double getAltura(){return altura;}
void setBase(double b){base=b;}
void setAltura (double h){altura=h;}
void mostrarDimension(){
System.out.println("La base y altura es: "+base+" y "+altura);
}
}
//Una subclase de DosDimensiones para Triangulo
//Triangulo.java
class Triangulo extends DosDimensiones{
private String estilo;
//Constructor
Triangulo(String s, double b, double h){
setBase(b);
setAltura(h);
estilo=s;
}
double area(){
return getBase()*getAltura()/2;
}
void mostrarEstilo(){
System.out.println("Triangulo es: "+estilo);
}
}
class Lados3{
59
public static void main(String[] args) {
Triangulo t1=new Triangulo("Estilo 1",4.0,4.0);
Triangulo t2=new Triangulo("Estilo 2",8.0,12.0);
System.out.println("Información para T1: ");
t1.mostrarEstilo();
t1.mostrarDimension();
System.out.println("Su área es: "+t1.area());
System.out.println();
System.out.println("Información para T2: ");
t2.mostrarEstilo();
t2.mostrarDimension();
System.out.println("Su área es: "+t2.area());
}
}
Salida:
Información para T1:
Triangulo es: Estilo 1
La base y altura es: 4.0 y 4.0
Su área es: 8.0
60
El primero llama a un constructor de superclase.
El segundo se usa para acceder a un miembro de la superclase que ha
sido ocultado por un miembro de una subclase.
61
Herencia Jerárquica: en la herencia jerárquica, una clase sirve como una
superclase (clase base) para más de una subclase. En la imagen inferior, la
clase A sirve como clase base para la clase derivada B, C y D.
62
través de Interfaces. En la imagen a continuación, la Clase C se deriva de
la interfaz A y B.
63
Datos importantes acerca de la herencia en Java
3.4. Polimorfismo
Polimorfismo de asignación
Polimorfismo puro
64
Sobrecarga
Polimorfismo de inclusión
Ejemplo de Polimorfismo
class Animal {
System.out.println("Grr...");
System.out.println("Meow");
65
}
System.out.println("Woof");
Como todos los objetos Gato y Perro son objetos Animales, podemos hacer lo
siguiente
a.makeSound();
//Outputs "Woof"
b.makeSound();
//Outputs "Meow"
66
Sobrecarga: El más conocido y se aplica cuando existen funciones con el
mismo nombre en clases que son completamente independientes una de la otra.
Polimorfismo paramétrico
class Overload
67
}
double demo(double a) {
return a*a;
class MethodOverloading
double result;
Obj .demo(10);
Salida de datos:
68
a: 10
a and b: 10,20
double a: 5.5
O/P : 30.25
Polimorfismo de inclusión
En él, una subclase define un método que existe en una superclase con una lista
de argumentos (si se define otra lista de argumentos, estaríamos haciendo
sobrecarga y no redefinición).
@Override
69
El polimorfismo presenta unas claras ventajas aplicado desde las interfaces, ya
que nos permite crear nuevos tipos sin necesidad de modificar las clases ya
existentes. Basta con recompilar todo el código que incluye los nuevos tipos
añadidos sin retocar la clase anteriormente creada para añadir una nueva
implementación lo que podría suponer una revisión completa de todo el código
donde se instancia la clase.
Por contra, un método está sobrecargado si dentro de una clase existen dos o
más declaraciones de dicho método con el mismo nombre, pero con parámetros
distintos, por lo que no hay que confundirlo con polimorfismo.
El compilador, viendo los parámetros, sabe a qué método llamar en función del
parámetro que estás pasando. La sobrecarga se resuelve en tiempo de
compilación utilizando los nombres de los métodos y los tipos de sus
parámetros; el polimorfismo se resuelve en tiempo de ejecución del programa,
esto es, mientras se ejecuta, en función de la clase a la que pertenece el objeto.
70
Overloading significa que un mismo método tiene diferentes firmas mientras
que Overriding es el mismo método, por tanto, misma firma, al que diferentes
clases conectan a través de la herencia. En algunos textos encontramos otra
explicación en donde se resume la sobrecarga como un ejemplo de
polimorfismo en tiempo de compilación y la sobreescritura como un ejemplo
de polimorfismo en tiempo de ejecución.
Sí, es posible tener dos más métodos estáticos con el mismo nombre siempre
que se diferencien en los parámetros de entrada.
class Demo{
Demo.main("Ducks");
// Sobrecargando
Demo.main("Dogs","Cats");
System.out.println("Hello, " + arg1 + " and " + arg2); // Hello Dogs and
Cats
71
}
72