Fecha y hora actual: Jueves 17 Ene 2019 04:10
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Curso VB .NET - Tema 1.20 - Clases, Herencia - Java

Responder al Tema

Índice del Foro > Visual Basic .NET > Curso VB .NET - Tema 1.20 - Clases, Herencia - Java

Autor Mensaje
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3200
Ubicación: Valencia - España

Mensaje Publicado: Miércoles 25 Mar 2009 20:58

Título del mensaje: Curso VB .NET - Tema 1.20 - Clases, Herencia - Java

Responder citando

Curso de programación en .NET - Tema 1.20 - Clases, Herencia - Java

1. Clases, Herencia, Java.

1.1 Objetivos del tema.
La herencia es una de las características de las clases, vamos a ver el funcionamiento y sus ventajas de cara al uso dentro de los programas en Java.

1.2 Introducción.
La herencia es una de las posibilidades que nos ofrece el uso de las clases en general.

Java ofrece esta posibilidad utilizando la herencia simple.
Java permite la creación de clases que pueden ser

  • heredadas, cualquier clase, Extends
  • deben ser heredadas obligatoriamente Abstract, no se pueden crear objetos con ella
  • o no pueden ser heredadas Final


Evidentemente cualquier clase puede ser heredada excepto las que se declaren en uno de los otros formatos.
El fin de la herencia es el crear un punto de partida con un código existente y que ya está asentado, o no, para ampliar las capacidades en una nueva versión o modificar ciertos aspectos de la clase base.

1.3 Clase base, origen.
Veamos un ejemplo de herencia

Código:
package tema_20;
public class Ejemplo
{
   // La variable se hace pública
   public int Contador = 0;
   public void Ejemplo()
   {
   }
   public void Incrementa()
   {
      Contador += 1;
   }
   public void Resta()
   {
      Contador -= 1;
   }
   public void Visualiza()
   {
      System.out.println("Contador vale " + Contador);
   }
}


El ejemplo anterior de clase contiene una serie de métodos.

Código:
package tema_20;
public class Nueva extends Ejemplo
{
   public Nueva()
   {
   }
}


En la clase que se describe no hay ni una sola línea de código pero adquiere todas las capacidades de la clase Ejemplo.

Y si nos fijamos en el programa principal.

Código:
package tema_20;
public class Main
{
   public static void main(String[] args)
   {
      Nueva Objeto = new Nueva();
      Objeto.Contador=5;
      Objeto.Visualiza();
      Objeto.Incrementa();
      Objeto.Visualiza();
   }
}
End Module


Y ejecutamos dicho ejemplo podremos observar como el resultado es el adecuado.

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Contador vale 5
Contador vale 6
BUILD SUCCESSFUL (total time: 2 seconds)


Así de sencillo.
La clase Ejemplo es la clase base, u origen.

Código:
public class Nueva extends Ejemplo


Lo único que se ha hecho es añadir “extends Ejemplo”, de esa forma indicaremos que la clase Nueva hereda el contenido de la clase Ejemplo.

1.4 Clase derivada.
Por lo tanto la clase Nueva es la clase derivada.
La clase derivada es la clase resultante al heredar la clase Ejemplo, y asumirá todas las características de las clases origen.
Además en esta clase podemos añadiremos las características necesarias para que cumpla la función para la cual se diseña.

1.5 Resultado de la herencia.
Como consecuencia de la herencia, debemos disponer de la posibilidad, porque es una de sus necesidades, de poder reescribir o reemplazar métodos de la clase base, con el fin de sustituirlos.

Pero también podría ser que nos interese que un método de nuestra clase no pueda ser reescrito.

De esa forma es como se va tejiendo las características de las clases en la herencia.
Para ello se dispone de los siguientes modificadores:

  • Abstract, Clase Obliga a que la clase sea escrita en una herencia, desarrollada.
  • Reescribir un método. Para reemplazar un método es suficiente con reescribirlo utilizando la misma definición que el método de la clase base.
  • Igual nombre, igual número de argumentos y del mismo tipo todos.
  • Final Impide que se reemplace o se herede una clase.
  • Abstract, método Indica que debe escribirse éste método en la clase derivada de forma obligatoria. Esto implica que la clase debe declararse de forma obligatoria como Abstract, ya que es obligatorio desarrollar dicho método.


Cuando se hereda una clase Abstract , el formato de la clase nueva en la que se hereda otra clase queda como sigue:

Código:
package tema_24;
public class Nueva extends Ejemplos
{
   @Override
   public void EscribirMetodo()
   {
      System.out.println("Hola");
   }
}


O bien

Código:
package tema_24;
abstract class Nueva extends Ejemplos
{
   @Override
   public void EscribirMetodo()
   {
      System.out.println("Hola");
   }
}


La diferencia es que en un caso obliga a ser heredada de nuevo y en el otro no, y se pueden instanciar objetos.

En la que la clase Ejemplos contiene:

Código:
package tema_24;
abstract class Ejemplos
{
   public Ejemplos()
   {
   }
   abstract void EscribirMetodo();
   public double AreaCirculo(double Radio)
   {
   .. / ..


Como podemos ver el método

Código:
abstract void EscribirMetodo();


esta declarado como abstract, y eso provoca que la clase en su conjunto sea:

Código:
abstract class Ejemplos


en lugar de

Código:
public class Ejemplos


Observar como se desarrolla el método EcribirMetodo.

Código:
@Override
public void EscribirMetodo()
{
   System.out.println("Hola");
  }


Que se corresponde con

Código:
abstract void EscribirMetodo();


De la clase base.
Si observamos la imagen podemos ver como NetBeans nos avisa con el símbolo en verde del lateral que estamos implementando el método de la clase Ejemplos.



1.6 Referencias en el código de una clase, This, Super.
¿Qué es esto.?
Ya hemos visto parte en el ejemplo anterior.
Si creamos clases, es para crear objetos con ellas.

Sí las clases tienen como característica que se puedan heredar en otra clase, ¿qué pasa, si a mí me interesa usar el método de la clase heredada en lugar del método que estoy escribiendo para ésta clase en un momento dado?.

Código:
package tema_20;
public class Base
{
   public void Sombreado()
   {
      System.out.println("Texto desde sombreado");
   }
   public void MiMetodo()
   {
      System.out.println("Cadena en clase base");
   }
}


Esta sería una clase base, en la que estamos haciendo uso de Super y This.
El ejemplo que sigue puede dar una idea del uso de This y Super, pero como realmente se aprecia el ejemplo es ejecutándolo paso a paso, con <F7>, y no solo una vez, para comprenderlo.
Hay que fijarse en que MiMetodo está definido en las dos clases, y en función del uso de This o Super se ejecuta uno u otro.

Código:
package tema_20;
public class Derivada extends Base
{
   public void MiMetodo()
   {
      System.out.println("Cadena en clase derivada");
   }
   @Override
   public void Sombreado()
   {
      System.out.println("Texto desde sombreado derivada");
      super.Sombreado(); // llama al de clase base
      super.MiMetodo(); // llama al de clase base
      this.MiMetodo(); // Al de esta clase
      MiMetodo(); // Al de esta clase
   }
}


Super, se utiliza para llamar desde la clase derivada a un método de la clase base que ha sido reemplazado en la clase derivada, pero que sin embargo posee código que nos interesa se ejecute, porque lo que estamos haciendo en realidad es una ampliación del código de la clase base.

Y el principal sería:

Código:
package tema_20;
public class Main
{
   public static void main(String[] args)
   {
      Nueva Objeto = new Base();
      Objeto.MiMetodo();
      Objeto.Sombreado();
      System.out.println("Objeto heredado");
      Otra Obje = new Derivada();
      Obje.MiMetodo();
      Obje.Sombreado();
   }
}


El resultado de la ejecución.

Código:
init:
deps-jar:

compile:
run:
Cadena en clase base
Texto desde sombreado
Objeto heredado
Cadena en clase derivada
Texto desde sombreado derivada
Texto desde sombreado
Cadena en clase base
Cadena en clase derivada
Cadena en clase derivada
BUILD SUCCESSFUL (total time: 0 seconds)



Observemos estas líneas.

Código:
super.MiMetodo(); // llama al de clase base
Esta accede al código de la clase base.
this.MiMetodo(); // Al de esta clase
MiMetodo(); // Al de esta clase


Y estas dos acceden al mismo método, pero sin embargo el uso de This, permite dejar claro cuales son las intenciones, aunque cuando no se índica, Java selecciona el más próximo por defecto.

1.7 Limitaciones en la herencia.
Todos los campos y métodos de una clase son siempre accesibles para el código de la misma clase.
Para controlar el acceso desde otras clases, y para controlar la herencia por las clases derivadas, o subclases, los elementos (atributos y métodos) de las clases tienen tres situaciones posibles de control de acceso:

  • Público, public Los miembros declarados públicos son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases.
  • Privado, private Los miembros declarados privados son accesibles sólo en la propia clase.
  • Protegido, protected Los miembros declarados protegidos son accesibles sólo para sus subclases


1.8 Ejercicios propuestos.
1. Escribir una clase que se tenga que heredar y en la que haya un método que se deba escribir en la clase heredada.
2. Escribir una clase que herede la clase anterior y que desarrolle el método pendiente en dicha clase, crear un objeto de ésta clase que permita realizar la prueba de funcionamiento de dicho método.

1.9 Solución a los ejercicios propuestos.
1. Escribir una clase que se tenga que heredar y en la que haya un método que se deba escribir en la clase heredada.

Código:
package tema_20;
public abstract class Ejercicio
{
   public void Ejercicio()
   {
   }
   abstract void VisualizarAbecedario();
}


2. Escribir una clase que herede la clase anterior y que desarrolle el método pendiente en dicha clase, crear un objeto de ésta clase que permita realizar la prueba de funcionamiento de dicho método.

Código:
package tema_20;
public class Nueva extends Ejercicio
{
   public Nueva()
   {
   }
   public void VisualizarAbecedario()
   {
      int i=65;
      char a;
      while (i<91)
      {
         a = (char) i;
         System.out.println(a);
         ++i;
      }
   }
}


Su utilización:

Código:
package tema_20;
public class Main
{
   public static void main(String[] args)
   {
      Nueva Objeto = new Nueva();
      Objeto.VisualizarAbecedario( );
   }
}




Autor del curso: casiopea


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda con TestNG Parametrico en java netbeans

baltigo Java 0 Sábado 30 Jun 2018 01:37 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Dudas al instanciar clases heredadas

MMCA Java 0 Viernes 26 Ene 2018 21:34 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Publicar Aplicación web JAVA en tomcat

Irvin Java Web 1 Viernes 13 Oct 2017 17:54 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Imagen referencial De creación de jtable en apl...

Jensel S.G Java 6 Miércoles 13 Sep 2017 20:06 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Clases

angeljonh C, C#, Visual C++ 2 Miércoles 30 Ago 2017 06:20 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,