martes, 21 de abril de 2009

Herencia y Poliformismo, Ejemplo

La Herencia es el mecanismo por el que podemos definir una clase a partir de otra que ya exista, de forma que la nueva clase tendrá todas las variables y métodos de la clase a partir de la que se crea, más las variables y métodos nuevos que necesite. A la clase base a partir de la cual se crea la nueva clase se le llama superclase.


Has visto que las clases se definen de la siguiente manera
class MiClase {
//campo, constructor y declaraciones del metodo
}

La herencia se puede aplicar de las siguiente manera

class MiOtraClase extends MiClase { //Se crea una clase MiOtraClase de tipo MiClase
//campo, constructor y declaraciones del metodo
}

O tambien

Miclase MiOtraClase = new Miclase(); // se crea la subclase MiOtraClase de tipo MiClase


Esta es la declaracion de una clase. El cuerpo de la clase (area entre el signo de llaves) contiene todo el codigo que se le da para el ciclo de vida a los objetos creados de la clase: constructores para inicializar nuevos objetos, declaraciones, para los campos que proveen el estado de la clase y sus objetos, y metodos para implementar la conducta de la clase y sus objetos.

La parte más difícil de entender es el polimorfismo, es decir, la técnica que permite pasar un objeto de una clase derivada a funciones que conocen el objeto solamente por su clase base.

Por ejemplo, si se tiene la clase CCoche, se puede crear la subclase sucoche, que es una especialización de CCoche

Primero definimos las clases de la siguiente manera:

La superclase es CCoche
La subclase es SuCoche


El codigo de la superclase quedaria de la siguiente manera:


/*
* CCoche.java
*
* Created on April 22, 2009, 1:44 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package Coche;

/**
*
* @author Marco Antonio Trejo Lemus
*/
public class CCoche {

/** La clase Ccoche tiene 5 campos */
private boolean encendido = false;
String marca;
String modelo;
String color;
int velocidad;

public void ArrancarMotor() {
{
if (encendido == true)
{
System.out.println("El motor ya esta encendido");
}
else
{
encendido=true;
System.out.println("El motor ha sido encendido");
}
}
}
public void CambiarVelocidad(int numvel)
{
if (encendido == false)
{
System.out.println("El motor esta apagado");
}
else
{
if (numvel == 0) {
//velocidad = 1;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 1){
//velocidad = 2;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 2){
//velocidad = 3;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 3){
//velocidad = 4;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 4){
//velocidad = 5;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
}
}

public void ApagarMotor()
{
if (encendido == false)
{
System.out.println("El motoror ya esta apagado");
}
else
{
encendido=false;
System.out.println("El motor ha sido apagado");
}
}

public void Acelerar()
{
if (encendido == false)
{
System.out.println("El motoror esta apagado... encender");
}
else
{
System.out.println("Acelerando...");
velocidad +=1;
}
}
public void Frenar()
{
if (encendido == false)
{
System.out.println("El motor esta apagado");
}
else
{
System.out.println("Frenando el motor...");
velocidad -=1;
}
}
} //fin de la clase




El codigo de la subclase es el siguiente:



/*
* SuCoche.java
*
* Created on April 22, 2009, 1:44 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package Coche;

/**
*
* @author Marco Antonio Trejo Lemus
*/

public class SuCoche {

/** Crea una nueva instancia de SuCoche */

public SuCoche() {
}

public static void main(String[] args)
{
CCoche sucoche = new CCoche(); // se crea la subclase sucoche de tipo CCoche

sucoche.color="Rojo"; // se utilizan los metodos heredados de CCoche
sucoche.marca="Mustang";
sucoche.modelo="2007";
sucoche.velocidad =0;
sucoche.ArrancarMotor();
sucoche.CambiarVelocidad(2);
sucoche.Acelerar();
sucoche.Acelerar();
sucoche.CambiarVelocidad(3);
sucoche.Acelerar();
sucoche.Acelerar();
sucoche.CambiarVelocidad(4);
sucoche.Frenar();
sucoche.Frenar();
sucoche.CambiarVelocidad(3);
sucoche.Frenar();
sucoche.Frenar();
sucoche.CambiarVelocidad(2);
sucoche.Frenar();
sucoche.CambiarVelocidad(1);
sucoche.ApagarMotor();
}
} //fin de la clase



Para este ejemplo definimos como main a la clase SuCoche
el resultado seria el siguiente:

El motor ha sido encendido
El motor ha cambiado a velocidad 2
Acelerando...
Acelerando...
El motor ha cambiado a velocidad 3
Acelerando...
Acelerando...
El motor ha cambiado a velocidad 4
Frenando el motor...
Frenando el motor...
El motor ha cambiado a velocidad 3
Frenando el motor...
Frenando el motor...
El motor ha cambiado a velocidad 2
Frenando el motor...
El motor ha cambiado a velocidad 1
El motor ha sido apagado

En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sería como obtener el objeto toro mecánico a partir de una máquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidad del toro de verdad al toro mecánico, con lo cual no sería necesaria la herencia múltiple sino simplemente la compartición de funcionalidad que se encuentra implementada en Java a través de interfaces.


Siguiente tema... Interfaces


Saludos

Sumar variables

Uno de los principios basicos es poder majenar la informacion de los programas mediante declaraciones de variables y operaciones entre estas, a continuacion muestro como se pueden sumar dos variables


Aqui el codigo:


/*
* Sumar.java
*
* Created on 22 April, 2009, 1:33 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package Sumar;

/**
*
* @author Marco Antonio Trejo Lemus
*/
public class Sumar {

/** Creates a new instance of Sumar */

public static void main(String args[])
{
//Declaracion e inicializacion de variables
int a = 2, b = 3, c = 6, d = 11;
long suma = 0;

suma = a + b + c + d; // suma las cantidades de las variables

System.out.println("La suma es " + suma); //Imprime el resultado de la suma

}

} //fin de la clase


Saludos

Obtener Datos de Entrada

Un amigo que recientemente empezaba a hacer programas en Java me preguntaba que como le podia hacer para capturar un dato y mandarlo imprimir, y le envie este programita que pide datos con System.out.println(),`recibe los datos del teclado con dataIn.readLine(), los almacena en una variable llamada nombre que despues la manda imprimir con System.out.println("El nombre es " + nombre +"!")


El programa imprime:

Por favor teclea tu nombre: Marco
El nombre es Marco!


Y el codigo es el siguiente:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
*
* @author Marco Antonio Trejo Lemus
*/
public class ObtenerEntrada{

/**
* @param args argumentos de linea de comandos
*/
public static void main(String[] args) {

// Crear el objeto BufferedReader object del dispositivo de entrada standar.
// El dispositivo estandares tipicamente un teclado.
BufferedReader dataIn = new BufferedReader(new
InputStreamReader( System.in) );

// Pide al usuario introducir su nombre
String nombre = "";
System.out.println("Por favor teclea tu nombre:");

// Lee el dato dentro de la variable nombre
try{
nombre = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}

// Mostrar el nombre
System.out.println("El nombre es " + nombre +"!");
}

} //fin de la clase



Saludos!

El primer programa en Java....

El primer programa que principiantes de programador ejecutan en java y en cualquier lenguaje de programacion es el clasico Hola mundo! jejeje, tal vez en alguno de ustedes ruede alguna lagrima cuando se acuerden de los primeros programas que hicieron, algunos en C y C++ como yo que cuando imprimiamos nuestra primera linea con el printf("") o el cout<<"" fue genial! ja!

:D
:)

En java es algo similar pero se utiliza el System.out.println("");


El codigo quedaria asi:

/*
* Main.java
*
* Created on April 22, 2009, 1:29 AM
*
*
*/

package hola;

/**
*
* @author Marco Antonio Trejo Lemus
*/

public class Main {


public Main() {
}

/**
* @param args argumentos de linea de comandos
*/

public static void main(String[] args) {
// Empieza codigo de la aplicacion aqui

System.out.println("Hola mundo");
}

}


Saludos!

lunes, 20 de abril de 2009

Java Clases y Objetos

Unas definiciones clásicas, antes de nada.
Clase

Una clase define un miembro real o una entidad abstracta. Es el tipo o clasificación de datos. Una clase define el comportamiento y atributos de un grupo de objetos de características similares.




Clase Coche <--- Nombre de la clase
arrancar, ir, parar, girar <--- Metodos (funciones)
color, velocidad, carburante <--- Atributos (datos)

Objeto
Un objeto es una instancia o variable de una clase. Se dice que pertenece a la clase. Un objeto se distingue de otros miembros de la clase por sus atributos.




Coche.ferrari <--- Nombre del objeto,
Contiene:
arrancar, ir, parar, girar <--- Metodos (funciones)
color, velocidad, carburante <--- Atributos (datos)


Clases Relacionadas

Una clase describe un conjunto de objetos con un comportamiento común y atributos relacionados. Probablemente a estas alturas de la lectura la clase coche resulte ya pesada, así que se hace necesario un cambio de aires y utilizar otra clase de objetos.



Una clase relacionada es Fútbol, que es una especialización de la clase Pelota.
Otra clase relacionada es Equipo_deportivo, que es una generalización de la clase Pelota
Los objetos rara vez caen dentro de grupos completamente distintos. A menudo existe solapamiento entre el comportamiento de los grupos de objetos. Esto se ve incluso en la clase Pelota.

La clase PelotaDeTenis es como la clase Pelota, pero modifica su comportamiento para ser utilizada en el tenis. Por contra, la clase Equipamiento_Deportivo es una generalización de Pelota, pero las características comunes de todos los objetos del campo de juego se encuentran en ella.

La jerarquía mostrada se explota en la orientación a objetos para propiciar la reusabilidad a través de un mecanismo que es la herencia.

Herencia

La herencia es un mecanismo que permite la definición de una clase a partir de la definición de otra ya existente. La herencia permite a un conjunto de clases relacionadas permanecer bajo un único paraguas, de forma que puedan ser consideradas y manejadas colectivamente.

La herencia permite el refinamiento o especialización de una clase existente:

Se pueden definir los miembros
Se pueden ocultar los miembros
Se pueden añadir nuevos miembros
La herencia es la característica clave de los sistemas orientados a objeto para propiciar la reusabilidad:

Es la parte orientada de los sistemas de objetos
Implementa las relaciones es-un (type of) o es-una-clase-de (instance of)




La clase Pelota es la clase padre (o base, o superclase) en la jerarquía de abajo. Sus métodos y atributos son heredados por las clases derivadas (hijas o subclases). Para los objetos de las clases derivadas no es evidente si los métodos son nativos a Rugby o Fútbol, o si han sido derivados de una clase de nivel superior.

Fútbol es una clase de Pelota. Fútbol tiene todos los atributos y operaciones de Pelota. No obstante, la clase Fútbol ha ocultado (hecho privada) la operación desinflar (sacándola del interfaz público) y sobrecargando el método lanzar con una implementación apropiada para el fútbol.



La herencia es una forma de especialización en la que las clases hijas son refinadas para tener el comportamiento y atributos adecuados para la aplicación de que se trate. Al poder las clases derivadas añadir, redefinir y ocultar miembros, la herencia se convierte en reusabilidad programable.

Otra razón para redefinir un método es que la clase base proporcione una implementación no óptima. A la luz del contexto en que se usen, las subclases pueden proporcionar una implementación óptima. Por ejemplo, mejores algoritmos y técnicas de almacenamiento pueden ser posibles en determinadas clases derivadas.


Modelado con Objetos

Los problemas se pueden modelar en los términos específicos del dominio. Una de las ventajas de la aproximación orientada a objetos es que permite que el problema sea representado en términos específicos del dominio. Esto permite a los diseñadores construir modelos que se proyectan directamente en el problema de la aplicación.


Sistema escuela

Clase Libro
Clase Pizarra
Clase Tiza
Clase Diploma
Clase Borrador
Sistema interfaz gráfico de usuario

Clase Pantalla
Clase Ventana_De_Texto
Clase Botón
Clase Barra_De_Desplazamiento
Clase Ventana_De_Dialogo
La ventaja de crear modelos cercanos al dominio es que son fáciles de comprender, hay menor probabilidad de cometer errores y descuidos, y los modelos pueden ser verificados por los usuarios que definen los requisitos.

Clases Abstractas

Una clase abstracta es una descripción incompleta de algo. Un conjunto de operaciones y atributos que por sí solos no describen nada.

Las clases abstractas no pueden ser instanciadas
No es posible crear objetos o variables
Describen partes de objetos
Creadas por generalización, características comunes, pero no completas
Utilizadas en polimorfismo para definir operaciones comunes
Las clases abstractas se utilizan junto con la herencia
Hay mucho interés en torno al polimorfismo. Los métodos pueden ser polimórficos si se aplican objetos de distintas clases para conseguir el mismo significado semántico. Por ejemplo, lanzar puede ser implementado tanto para un objeto PelotaDeTenis como para el objeto Béisbol.

He aquí un ejemplo de clase abstracta. En un sistema de clase GUI (interfaz gráfica de usuario), los métodos para la GUI pueden ser abstraídos para conseguir la definición de múltiples interfaces. Por ejemplo, si se supone que la clase ventana de diálogo es una clase abstracta; esto permite que la implementación de la clase sea manejada por el programador.

¿Qué es Java?

Java nos permite jugar en línea, participar en sesiones de chat con internautas de todo el mundo, calcular los intereses de una hipoteca y ver imágenes en tres dimensiones, entre otras muchas aplicaciones. Es también esencial para las aplicaciones de intranet y otras soluciones de comercio electrónico que constituyen la base informática de las empresas.

"Java" generalmente se refiere a la combinacion de tres cosas: La programacion del lenguaje de programas( un nivel-alto, lenguaje de programacion orientada a objetos); La maquina virtual de Java( un alto funcionamiento , la maquina virtual ejecuta bytecodes en una plataforma especifica, tipicamente abreviada JVM); y la plataforma Java, una JVM ejecutandose y compijada en Java bytecodes, usualmente llamando a un grupo de librerias estandard las cuales las provee Java Standard Edition(SE) or o la Enterprise Edition (EE).