SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Java World – Capítulo 2   2



                                                                                                                                     h
                                                                                                                                     t
                                                                                                                                     t
                                                                                                                                     p
                                                                                                                                     :
                                                                                                                                     /
                                                                                                                                     /
                                                                                                                                     g
                                                                                                                                     u
                                                                                                                                     s
                                                                                                                                     t
                                                                                                                                     a
                                                                                                                                     v
                                                                                                                                     o
                                                                                                                                     a
                                                                                                                                     l
                                                                                                                                     b
                                                                                                                                     e
                                                                                                                                     r
                                                                                                                                     o
                                                                                                                                     l
                                                                                                                                     a
                                                                                                                                     .
                                                                                                                                     b
Agradecimientos                                                                                                                      l
                                                                                                                                     o
Quisiera darle las gracias a Matias Emiliano Alvarez Durán (quien ahora será coautor de JavaWorld) por su aporte, y por darme        g
ese empujón que tanta falta me hacía.                                                                                                s
Sin tu ayuda JavaWorld no hubiera visto nunca la luz.
                                                                                                                                     p
                                                                                                                       Gracias
                                                                                                                                     o
                                                                                                                                     t
                                                                                                                                     .
                                                                                                                                     c
                                                                                                                                     o
                                                                                                                                     m
3    Java World – Capítulo 2




h       Paradigmas de programación
t
t       Para aquellos que son iniciados en el tema de la programación, es bueno tener en cuenta un poco la evolución en temas de cómo se
p       programa.
:       Desde siempre la programación fue una serie de algoritmos que resuelven un problema, lo que cambió, fue la manera de agrupar y
        asociar estos algoritmos.
/
/       Paradigma estructural
v
a       Este paradigma busca como objetivo dividir un problema complejo (sistema), en varios problemas menos complejos (funciones).
l       Este es un paradigma que ha ido quedando en desuso con el correr de los tiempos, aunque aquellos que estén dando sus primeros
        pasos en alguna institución, puede que lo vean en lenguajes como Pascal o C++.
o
r       Paradigma orientado a objetos
c
r       En este paradigma, cada elemento del sistema se divide en objetos. Estos son representaciones de entidades que encontramos en la
e       vida real. Por ejemplo, si estuviéramos diseñando un sistema para un aeropuerto, sería más que factible encontrarse con las clases
        Aeroplano, Pasajero, Capitan.
a
        ¿Pero, y la diferencia?
t       En este paradigma, cada entidad es responsable de realizar las acciones que le conciernen, y solo las que le conciernen.
i       Supongamos que estamos diseñando un juego, y tenemos un avión, según los paradigmas hubiéramos hecho lo siguiente:
v
o       Estrucura procedural en lenguaje C
.         typedef
b         struct Avion {
           int cantidadPasajerosSoportada;
l          float peso;
o          //... otras propiedades de un avion
g         } Avion_1;
s         public void volar(avion av) {
p           //... codigo
o         }
t
          public void aterrizar(avion av) {
.           //...codigo
c         }
o
          public main() {
m           volar(Avion_1)
            aterrizar(Avion_1)
          }
Java World – Capítulo 2     4

Estructura orientada a objetos en Java
  class Avion {                                                                                                                          h
   int cantidadPasajerosSoportada;
   float peso;                                                                                                                           t
   //... otras propiedades de un avión                                                                                                   t
                                                                                                                                         p
      public void volar() {
        //... Codigo                                                                                                                     :
      }                                                                                                                                  /
                                                                                                                                         /
      public void aterrizar() {
        //... Codigo                                                                                                                     g
      }                                                                                                                                  u
  }                                                                                                                                      s
  static public void main(String[] args) {
                                                                                                                                         t
    Avion avion_01 = new Avion();                                                                                                        a
    avion_01.volar();                                                                                                                    v
    avion_01.aterrizar();
  }
                                                                                                                                         o
                                                                                                                                         a
La diferencia más grande la podemos apreciar al momento de llamar a las acciones de volar y aterrizar. En el modelo estructural se
llama a una función a la cal se le pasa un avión como argumento, pero en el modelo orientado a objetos, se le dice al propio avión
                                                                                                                                         l
que vuele o aterrice.                                                                                                                    b
                                                                                                                                         e
                                                                                                                                         r
                                                                                                                                         o
                                                                                                                                         l
                                                                                                                                         a
                                                                                                                                         .
                                                                                                                                         b
                                                                                                                                         l
                                                                                                                                         o
                                                                                                                                         g
                                                                                                                                         s
                                                                                                                                         p
                                                                                                                                         o
                                                                                                                                         t
                                                                                                                                         .
                                                                                                                                         c
                                                                                                                                         o
                                                                                                                                         m
5    Java World – Capítulo 2


        Definición de una clase
h
t         public class Persona {
t          //Atributos
           String nombre;
p          String apellido;
:          int edad;
/          float peso;
/
              //Constructores
v             public Persona(String nombre, String apellido) {
a               //Código ...
              }
l
o             //Métodos
r             public void correr(){
                //Código...
c
              }
r
e             public void caminar(){
                //Código...
a
              }
t
i             public void hablar(){
v               //Código...
              }
o         }
.
        Básicamente, una clase contiene estos elementos:
b
l                  Atributos           Definen el estado de un objeto
o                  Métodos             Definen el comportamiento (pueden ser de clase o de objeto)
g                  Constructores       Permiten crear objetos
s              Existen otros elementos que pertenecen a la clase, y no al objeto. Estos contienen el identificador static.
p              Pero no te preocupes, ya los veremos.
o
t       Diferencia entre clase y objeto
.
        Una clase representa una especie de molde para cada objeto. Cuando nosotros creamos un objeto, lo hacemos utilizando alguna
c       clase en particular, esto quiere decir que el objeto creado, puede realizar el comportamiento de la clase, y contiene todos sus
o       atributos.
m       Vamos a verlo con un ejemplo más gráfico. Utilicemos la clase Persona que definimos anteriormente.
        Basandonos en ella, podemos apreciar que cada Persona (clase), tendrá ciertas características (atributos). Por ejemplo, supongamos
        una persona llamada Gabriel y otra Laura.
Java World – Capítulo 2   6



                 Clase                                              Objetos                                                          h
                                                                                                                                     t
                                                                                      Gabriel
                                                                                                                                     t
                                                                              Gabriel                                                p
                                                                                                                                     :
                                 Persona                                      Rarara
                                                                                                                                     /
                                                                              15                                                     /
                          Nombre
                                                                                                                                     g
                          Apellido                                            56.3                                                   u
                                                                                                                                     s
                          Edad
                                                                                       Laura                                         t
                          Peso                                                                                                       a
                                                                              Laura                                                  v
                                                                                                                                     o
                                                                              Momomo
                                                                                                                                     a
                                                                              38                                                     l
                                                                                                                                     b
                                                                              65.2
                                                                                                                                     e
                                                                                                                                     r
                                                                                                                                     o
Al definir un objeto de tipo Persona estamos diciendole a la JVM que cree una estructura con tales propiedades y tal                 l
comportamiento. En el ejemplo anterior, Laura y Gabriel también tienen la capacidad de correr(), caminar(), y hablar().              a
                                                                                                                                     .
                                                                                                                                     b
               Para todos aquellos que crean necesario y/o quieran profundizar en la programación orientada a objetos les
                                                                                                                                     l
               quisiera recomendar la siguiente bibliografía:
                        Head First Java Es muy amigable, y contiene una manera de explicar todo con texto e imágenes
                                                                                                                                     o
                        (permite mayor absorción de los conocimientos). La desventaja es que solo se encuentra en inglés.            g
                        Thinking in Java Es muy extenso y detallado, y hay una versión en castellano. La desventaja es que en        s
                        algunos momentos, puede llegar a ser un tanto abrumador.                                                     p
                        Busquen en internet “programacion + objetos + java”. Este es un tema más que abarcado en la web, y           o
                        encontrarán mucha información al respecto.                                                                   t
                                                                                                                                     .
                                                                                                                                     c
                                                                                                                                     o
                                                                                                                                     m
7    Java World – Capítulo 2


        Más conceptos de la POO
h
t       Al adentrarnos en este nuevo paradigma, no solamente cambia la manera de codificar, sino que se introducen varios conceptos que
        forman las bases de este, tales como encapsulamiento, polimorfismo y herencia.
t
p       Encapsulamiento
:
/       Algunos de los beneficios aportados por el paradigma de orientación a objetos (OO) son: flexibilidad y mantenimiento. Pero para
/       lograr esto, es necesario escribir las clases de una manera en particular.
        La clave para lograr esto es encapsular la lógica y el estado de la clase para que no pueda ser accedido de forma directa, y dejar de
v
        manera publica un set de métodos para poder interactuar con la clase.
a       Las claves son:
l
o               Siempre mantener las variables de instancia protegidas (con un modificador de acceso, generalmente public)
r               Crea métodos públicos (public) para acceder a las variables de instancia
                Para los anteriores, utiliza la convención de nombres de JavaBeans
c
r       Herencia
e
a       Cuando utilizamos la herencia, a veces es necesario saber si un objeto pertenece a una clase en concreto. Para realizar esto
t       utilizamos el operador instanceof, este devuelve un boolean, siendo true en caso de que pertenezca a dicha clase, falso en caso
        contrario.
i
                 objeto instanceof clase
v
        Es posible crear relaciones de herencia en Java extendiendo una clase. Las dos características más comunes para utilizar la herencia
o       son:
.
b               Para promover la reutilización del código
                Para el uso del polimorfismo
l
o       El polimorfismo nos permite tratar una subclase como si fuera una clase del tipo de su superclase. La contrapartida de esto es que
g       solo se podrán llamar a los atributos que se encuentren disponibles para el tipo de clase declarada.
s
p       Is-A
o       Para el examen es necesario saber:
t
.               Is-A indica que la clase X es del tipo Y. Esto se logra a través de extends o implements.
                Al termino Is-A también se lo puede llamar: derived, subclass, inherits, o subtype.
c
                A la superclase también se la conoce como “supeclase”
o
m       Has-A

        Indica que una clase A tiene una variable de instancia que contiene una referencia a B.

        Polimorfismo

        Un objeto es polimórfico cuando cumple con al menos una condicios Is-A. Esto es cierto para todas las clases que no sean de tipo
        Object, ya que todas heredan de esta.
        La única manera de acceder a un objeto es a través de una variable de referencia. Algunas pautas para recordar de estas:

                Una variable de referencia puede ser de un solo tipo, y una vez que fue declarada, ese tipo jamás puede modificarse.
                Una referencia es una variable, de manera que puede ser reasignada a otros objetos (a menos que se declare como final).
Java World – Capítulo 2     8

        Un tipo de variable de referencia determina los métodos que pueden ser invocados sobre el objeto que la variable
        referencia.
                                                                                                                                          h
        Una variable de referencia puede tomar como referencia cualquier objeto del mismo tipo, o un subtipo del mismo.
        Una variable de referencia puede tener como tipo el de una interface. Si es declarada de esta manera, podrá contener              t
        cualquier clase que implemente la interfaz.                                                                                       t
                                                                                                                                          p
El concepto es que solo los métodos de instancia son invocados dinámicamente. Esto es logrado por la JVM, la cual siempre tiene
                                                                                                                                          :
conocimiento de que tipo de objeto es el que se está tratando, así como su árbol de herencia.
                                                                                                                                          /
Sobre escritura                                                                                                                           /
                                                                                                                                          g
Cada vez que una clase hereda un método de su superclase, existe la posibilidad de sobrescribir el método (a menos que este haya          u
sido declarado con el modificador de no acceso final). El beneficio de la sobre escritura es la habilidad de definir comportamiento
                                                                                                                                          s
particular para una clase específica.
Características necesarias para hacer uso de la sobre escritura:
                                                                                                                                          t
                                                                                                                                          a
        La lista de argumentos debe ser exactamente igual que el método a sobrecargar.                                                    v
        El valor de retorno debe ser del mismo tipo, o un subtipo.                                                                        o
        El modificador de acceso no puede ser más restrictivo que el del método a sobre escribir.
                                                                                                                                          a
        El modificador de acceso puede ser menos restrictivo que el método a sobre escribir.
                                                                                                                                          l
        Los métodos de instancia solo pueden ser sobre escritos si es que son heredados por la subclase.
                                                                                                                                          b
        El método sobre escrito puede lanzar cualquier excepción sin verificación en tiempo de ejecución, sin importar de las
        excepciones que hayan sido declaradas en el método de la superclase.                                                              e
        El método no deberá lanzar excepciones verificadas que son nuevas o amplían a las ya definidas por el método a sobre              r
        escribir.                                                                                                                         o
        El método sobre escrito puede lanzar una cantidad menor de excepciones que las definidas en el método a sobre escribir.           l
        No puedes sobre escribir un método que haya sido declarado como final (creo que es la 20ª vez que repetimos esto,                 a
        pero, nunca es suficiente).
                                                                                                                                          .
        No es posible sobre escribir un método que haya sido declarado como static.
                                                                                                                                          b
        Si un método no puede ser heredado, no puede ser sobre escrito.
                                                                                                                                          l
Invocando la versión de la superclase de un método sobre escrito                                                                          o
                                                                                                                                          g
También es posible valerse del código definido en la superclase. La manera de invocarlo es con la palabra super (esta hace
                                                                                                                                          s
referencia a la superclase).
                                                                                                                                          p
                En el caso de que un método sobre escrito no declare alguna excepción del método a sobre escribir, si se utiliza          o
                como referencia el tipo de la superclase, se espera que pueda llegar a generarse la excepción.                            t
                                                                                                                                          .
                                                                                                                                          c
                                                                                                                                          o
                                                                                                                                          m
9    Java World – Capítulo 2



         public class Generic {
h          public void doSomething() throws Exception {
t            // . . . some code here
           }
t        }
p
:        public class Specific extends Generic {
           public void doSomething() {
/            // . . . some code here
/          }
v        }
a
         public class Program {
l         static public void main ( String[] args ) {
o          Generic obj1 = new Specific();
           Specific obj2 = new Specific();
r
c                obj2.doSomething();
r                obj1.doSomething(); //Se genera un error de compilación, dado que no se declaro como recibir la excepción Exception
e
                 //El código podría solucionarse con un try-catch
a                try {
t                  obj1.doSomething();
i                } catch ( Exception ex ) {
                   //. . . some code here
v                }
o            }
.        }

b
l       Sobrecarga
o
        La sobrecarga de métodos permite utilizar el mismo nombre de un método, el cual toma una cantidad y/o tipo de parámetros
g       diferentes.
s       Las reglas para la sobrecarga son:
p
o                    Deben de modificarse la lista de parámetros.
                     Pueden modificar el tipo de valor de retorno.
t
                     Pueden cambiar el modificador de acceso.
.
                     Pueden declarar excepciones nuevas o más abarcativas.
c                    Pueden ser sobrecargados en la misma clase, o en una subclase.
o
m       Básicamente, un método sobrecargado no es más que un método completamente diferente, pero que utiliza un nombre que ya
        existe.

        Invocación de métodos sobrecargados

        Para invocar un método sobrecargado, es necesario especificar los parámetros del tipo esperado según el método que queramos
        invocar.
Java World – Capítulo 2   10

  public class Something {
   public void doSomething(int val) {
                                                                                                                                          h
     //. . . some code here
   }                                                                                                                                      t
                                                                                                                                          t
      public void doSomething(float val) {
                                                                                                                                          p
        //. . . some code here
      }                                                                                                                                   :
                                                                                                                                          /
      static public void main (String[] args){
                                                                                                                                          /
       Something s1 = new Something();
                                                                                                                                          g
          int valor1 = 1;                                                                                                                 u
          float valor2 = 2.3;                                                                                                             s
          s1.doSomething(valor1); //Se invoca al método doSomething(int val)                                                              t
          s1.doSomething(valor2); //Se invoca al método doSomething(float val)                                                            a
          s1.doSomething(new Object); //Error de compilación. No existe ningún método que reciba como parámetro un tipo Object            v
      }
  }                                                                                                                                       o
En el caso de la invocación con objetos, se vuelve un poco más complicado.                                                                a
                                                                                                                                          l
  public class Generic {}
  public class Specific extends Generic {}                                                                                                b
                                                                                                                                          e
  public class Program {                                                                                                                  r
      public void doSomething(Generic obj) {                                                                                              o
        //. . . some code here                                                                                                            l
      }                                                                                                                                   a
      public void doSomething(Specific obj) {                                                                                             .
        //. . . some code here                                                                                                            b
      }                                                                                                                                   l
      static public void main (String[] args) {                                                                                           o
       Generic obj1 = new Generic();                                                                                                      g
       Specific obj2 = new Specific();                                                                                                    s
       Generic obj3 = new Specific();
                                                                                                                                          p
          Program p = new Program();                                                                                                      o
                                                                                                                                          t
          p.doSomething(obj1); //Se invoca al método doSomething(Generic obj)
          p.doSomething(obj2); //Se invoca al método doSomething(Specific obj)
                                                                                                                                          .
          p.doSomething(obj3); //Se invoca al método doSomething(Generic obj)                                                             c
      }                                                                                                                                   o
  }
                                                                                                                                          m
En el último caso, por más que obj3 sea de tipo Specific, la referencia contiene un tipo Generic, y es esta la que determina a
que método se invoca.
11    Java World – Capítulo 2


         Polimorfismo en sobre escritura y sobrecarga
h
t        El polimorfismo no determina que método invocar cuando se trata de sobrecarga, pero si cuando se trata de sobre escritura.
         Tabla de diferenciación entre sobrecarga y sobre escritura:
t
                                 Sobrecarga de método                   Sobre escritura de método
p
         Parámetros              Deben cambiar.                           No deben cambiar.
:        Valor de retorno        Puede cambiar el tipo.                   No puede cambiar, salvo por alguna covariante (subclass).
/        Excepciones             Pueden cambiar.                          Pueden reducirse o eliminarse. No se pueden lanzar nuevas
/                                                                         excepciones u otras más abarcativas.
v        Modificadores      de   Pueden cambiar                           No pueden ser más restrictivos (pueden ser menos restrictivos).
a        acceso
         Invocación              El tipo de la referencia determina que   El tipo del objeto determina que método invocar. Sucede en
l
                                 método invocar.                          tiempo de ejecución.
o
r
c
r
e
a
t
i
v
o
.
b
l
o
g
s
p
o
t
.
c
o
m
Java World – Capítulo 2    12

Casteo de variables de referencia

En ciertas ocasiones, es necesario utilizar un método de la clase específica (subclase), pero la referencia es de la superclase. En estos
                                                                                                                                                   h
casos se utiliza un casteo denominado downcast. El problema con este tipo de casteos, es que no generar errores en tiempo de                       t
compilación, pero pueden generarlos en tiempo de ejecución.                                                                                        t
  public class Generic () {                                                                                                                        p
    public void doSomething() {                                                                                                                    :
      // . . . some code here                                                                                                                      /
    }
  }                                                                                                                                                /
                                                                                                                                                   g
  public class Specific (){                                                                                                                        u
    public void doSomethingMoreSpecific() {
      // . . . some code here                                                                                                                      s
    }                                                                                                                                              t
  }                                                                                                                                                a
  public class Program {
                                                                                                                                                   v
   static public void main (String[] args) {                                                                                                       o
    Generic g1 = new Specific();                                                                                                                   a
    Generic g2 = new Generic();
                                                                                                                                                   l
    g1.doSomething();                                                                                                                              b
    g1.doSomethingMoreSpecific(); //Genera un error de compilación "cannot find symbol", esto indica que la clase Generic no                       e
  contiene un método doSomethingMoreSpecific
                                                                                                                                                   r
    Specific s1 = (Specific)g1;
    s1.doSomethingMoreSpecific(); //En este caso, la instancia es de tipo Specific, de manera que conoce el método                                 o
  doSomethingMoreSpecific                                                                                                                          l
                                                                                                                                                   a
    g2.doSomething();
    g2.doSomethingMoreSpecific(); //Genera un error de compilación "cannot find symbol", esto indica que la clase Generic no                       .
  contiene un método doSomethingMoreSpecific                                                                                                       b
    s1 = (Specific)g2; //Se genera un error en tiempo de ejecución "java.lang.ClassCastException"
                                                                                                                                                   l
      //Para prevenir esto en tiempo de ejecución, antes de realizar el downcast verificamos que el objeto sea del tipo a castear                  o
      if ( g2 instanceof Specific ) { //Como el objeto no es de tipo Specific, ni un subtipo del mismo, la sentencia if resulta false, y no        g
  se entra en la condición, previniendo el error en tiempo de ejecución
                                                                                                                                                   s
        s1 = (Specific)g2;
        s1.doSomethingMoreSpecific();                                                                                                              p
  //También se puede realizar un casteo directo como el siguiente                                                                                  o
  ((Specific)g2).doSomethingMoreSpecific();                                                                                                        t
      }
    }                                                                                                                                              .
  }                                                                                                                                                c
Lo único que el compilador verifica es que el tipo de la variable con el tipo a castear se encuentren en el mismo árbol de herencia.               o
Lo que si puede generar un error de casteo es al intentar realizar un upcasting.                                                                   m
13    Java World – Capítulo 2



           public class Generic {}
h          public class Specific extends Generic{}
t          public class Another {}
t          public class Program {
p           static public void main (String[] args) {
:            Specific sp = new Specific();
             Another an = new Another();
/
/                  Generic s1 = (Generic)sp;
v                  Generic an = (Generic)an; //Error de compilación al intentar realizar un upcasting "inconvertible types"
a
                   //El upcasting también se puede escribir de la siguiente manera
l                  Generic s1 = sp; //Esta sintaxis automáticamente está realizando un upcasting
o              }
           }
r
c        También, puede darse un caso como el planteado a continuación:
r          public interface Doable {
e            void doSomething();
           }
a
t          public class Generic implements Doable {
i            public void doSomething() {
               //. . . some code here
v            }
o          }
.          public class Specific extends Generic {}
b        La clase Specific puede ser tanto de tipo: Specific, Generic, o Doable, dado que su superclase la implementa, y ya se hizo
l        cargo de darle un cuerpo a los métodos definidos en la interfaz.

o
g
s
p
o
t
.
c
o
m
Java World – Capítulo 2    14

Implementar (implements) una interfaz

Cuando se implementa una interfaz, lo que se hace es aceptar el contrato provisto por esta, e implementarlo en la clase. Para el
                                                                                                                                             h
compilador, lo único que requiere es que se le dé una implementación legal al método, pudiendo ser esta un cuerpo vacío por                  t
ejemplo ({}).                                                                                                                                t
Para que la implementación de una interfaz sea legal, la primer clase no abstracta del árbol de herencia debe cumplir con las                p
siguientes reglas:                                                                                                                           :
        Especificar una implementación concreta para todos los métodos definidos en el contrato de la interfaz.
                                                                                                                                             /
        Seguir todas las reglas para la sobre escritura de métodos.                                                                          /
        Declarar sin excepciones controles sobre los métodos de ejecución distintos de los declarados por el método de interfaz, o           g
        subclases de los declarados por el método de interfaz.                                                                               u
        Mantener la misma firma del método, y devolver un valor del mismo tipo (o subtipo).                                                  s
                                                                                                                                             t
                                                                                                                                             a
Tipos de valor de retorno válidos                                                                                                            v
                                                                                                                                             o
Esta sección implica dos cosas:
                                                                                                                                             a
        Lo que se puede declarar como un valor de retorno.                                                                                   l
        Qué tipo de dato se puede devolver realmente como valor de retorno.                                                                  b
                                                                                                                                             e
Declaración de tipos de valor de retorno (Return types declaration)
                                                                                                                                             r
Esta sección indica que tipo de valor de retorno puedes escribir en la declaración del método, dependiendo si se trata de un método:         o
                                                                                                                                             l
        Sobrecargado
                                                                                                                                             a
        Sobre escrito
                                                                                                                                             .
        Nuevo
                                                                                                                                             b
Tipos de valor de retorno en métodos sobrecargados                                                                                           l
                                                                                                                                             o
El tipo de valor de retorno puede ser cualquiera (el método debe calificar para la declaración de sobrecarga).
                                                                                                                                             g
Tipos de valor de retorno en métodos sobre escritos                                                                                          s
                                                                                                                                             p
Se puede especificar el mismo tipo, o un subtipo (sublass), como tipo de valor de retorno (el método debe calificar para la                  o
declaración de sobre escritura).
                                                                                                                                             t
NOTA: esto es posible a partir de Java 5, en versiones anteriores, solo es posible utilizar el mismo tipo.
                                                                                                                                             .
Devolviendo un valor                                                                                                                         c
                                                                                                                                             o
Solo existen seis reglas:                                                                                                                    m
         Puedes devolver un null cuando el tipo es un objeto.
         Un array representa un tipo de dato valido como retorno.
         En un método con un valor de retorno de tipo primitivo, es posible devolver un tipo de dato de otro tipo, que sea casteado
         implícitamente al tipo de retorno.
         Idem anterior con un tipo que puede ser casteado explícitamente (se debe realizar el cast antes de devolver el valor).
         Si el tipo es void, el método no puede contener ningún return.
         Si el tipo es un objeto, se puede devolver cualquier objeto que sea del mismo tipo o que pertenezca al árbol de herencia (no
         superclases ni superiores). Cualquier tipo que pase la condición instanceof del tipo de valor de retorno es válido.
15    Java World – Capítulo 2


         Constructores e instanciación
h
t        Los objetos son construidos. No es posible construir un nuevo objeto, sin antes invocar el constructor.
         Los constructores representan bloques de inicialización, los cuales pueden llegar a ser invocados con el operador new (no es el caso
t
         de los bloques de inicialización estáticos).
p
:        Conceptos básicos de los constructores (Constructor basics)
/
/        Toda clase, incluidas aquellas que sean abstractas, deberán de tener un constructor. Pero esto no implica que el programador tenga
         que especificarlo.
v
a        Llamadas en cadena a constructores (Constructor chaining)
l
o        Suponiendo el siguiente árbol de herencia:
r
c                                         Clase                         Clase                        Clase
r                                       Especifico                    Generico                       Objeto
e
a
t
i        Al invocar la creación de un objeto de tipo Especifico, el proceso de inicialización es el siguiente:
v        1.      Se invoca el constructor se Especifico. Este invoca el constructor de Generico (esta invocación puede ser implícita o
o                explícita).
.        2.      Se invoca el constructor de Generico. Este invoca el constructor de Objeto (esta invocación es siempre implícita).
b        3.      Las variables de instancia del objeto Objeto reciben sus valores explícitos.
l        4.      Se ejecuta el constructor de Objeto.
         5.      Las variables de instancia del objeto Generico reciben sus valores explícitos.
o
         6.      Se ejecuta el constructor de Generico.
g        7.      Las variables de instancia del objeto Especifico reciben sus valores por defecto.
s        8.      Se ejecuta el constructor de Especifico.
p
o        Reglas de los constructores (Rules for constructors)
t
.
                          Las siguientes reglas representan las bases de los constructores, y serán necesarias para rendir el examen.
c
o
m                 Los constructores pueden utilizar cualquier modificador de acceso.
                  El nombre del constructor debe ser igual al de la clase.
                  Los constructores no deben de tener un valor de retorno.
                  Es legal tener un método que tenga el mismo nombre que la clase. Siempre que este tenga un valor de retorno, es un
                  método.
                  Si no se especifica explícitamente un constructor en la clase, implícitamente se genera un constructor que no recibe
                  parámetros.
                  Si se especifica al menos un constructor, el constructor implícito no será generado, de manera que si es necesario un
                  constructor con argumentos, y el por defecto, es necesario especificarlo explícitamente.
                  Todos los constructores tienen en la primer línea, una llamada a un constructor sobrecargado (this()), o una llamada a un
                  constructor de la superclase (super()).
Java World – Capítulo 2   16

        La llamada a un constructor de la superclase puede ser con o sin argumentos.
        Un constructor sin argumentos no es necesariamente un constructor por defecto (este es el que especifica el compilador,
                                                                                                                                         h
        en caso de no declarar explícitamente ningún constructor).
        No es posible acceder a una variable de instancia, o método de instancia, hasta que se ejecute el constructor de la              t
        superclase.                                                                                                                      t
        Solo variables y/o métodos estáticos pueden ser llamados al invocar un constructor mediante this() o super().                    p
        Las clases abstractas también tienen constructores, y estos son ejecutados cuando se instancie una subclase.                     :
        Las interfaces no tienen constructores. Las interfaces no forman parte del árbol de herencia.                                    /
        La única manera de invocar un constructor es desde otro constructor.                                                             /
Determinar cuándo se creará el constructor por defecto                                                                                   g
                                                                                                                                         u
El constructor por defecto será creado por el compilador, siempre que no se haya declarado ningún constructor en la clase.               s
                                                                                                                                         t
Como es el constructor por defecto?
                                                                                                                                         a
        Tiene el mismo modificador de acceso que la clase.                                                                               v
        No recibe ningún argumento (no tiene parámetros en su definición).                                                               o
        Llama al constructor de la superclase sin argumentos.                                                                            a
                                                                                                                                         l
Qué pasa si el constructor de la superclase requiere argumentos?
                                                                                                                                         b
        Es necesario crear explícitamente los constructores en la clase, y dentro de la implementación de estos, llamar al               e
        constructor de la superclase pasando los argumentos necesarios.                                                                  r
                                                                                                                                         o
Sobrecarga de constructores                                                                                                              l
Simplemente se comporta al igual que los métodos. Para sobrecargar un constructor basta con declarar varios de estos con
                                                                                                                                         a
diferentes parámetros.                                                                                                                   .
                                                                                                                                         b
                                                                                                                                         l
                Regla absoluta de los constructores. La primer línea de estos deberá ser una llamada a super() o this()
                                                                                                                                         o
                (pueden contener parámetros en la llamada, siempre que la llamada no la realice el compilador).
                                                                                                                                         g
                                                                                                                                         s
Alguno de los constructores de la clase deberá de llamar a super(), y verificar que todos los demás constructores terminen yendo         p
al que realiza dicha llamada.                                                                                                            o
                                                                                                                                         t
                                                                                                                                         .
                                                                                                                                         c
                                                                                                                                         o
                                                                                                                                         m
17    Java World – Capítulo 2


         Métodos y variables estáticos
h
t        Todos los métodos y atributos declarados con el modificador de no acceso
         static pertenecen a la clase y no al objeto (instancia de la clase).
t
         Para saber cuándo debemos deberíamos de crear un atributo o método
p
         estático, simplemente necesitamos saber si este requiere o no acceder a
:        algún atributo de la clase (en el caso de los métodos), o si debe ser un valor
/        compartido para todos los objetos (en el caso de los atributos).
/        Características de los atributos y métodos estáticos:
v
                  No es necesario inicializar ningún objeto para poder acceder a estos.
a
                  Los atributos estáticos son compartidos por todos los objetos (en
l                 realidad son de la clase, y dado que el objeto pertenece a dicha clase,   Lo que se viene
o                 también tiene acceso a los atributos y métodos de esta).                  En la próxima entrega estaremos
r                 Las variables estáticas tienen la misma inicialización por defecto que
                                                                                            adentrándonos en las asignaciones.
c                 las variables de clase.
r                 Un método estático no puede acceder a ningún miembro no estático
                  (main es estático!).                                                      Veremos que clases de literales existen
e
                  No existe la sobre escritura (overriding) de métodos estáticos, pero si   en el mundo de Java, y como utilizar
a
                  la sobrecarga (overloading).                                              cada uno de ellos, así como sus
t
                                                                                            compatiblidades e incompatibilidades.
i        Accediendo a métodos y variables estáticas
v
o        Dado que podemos acceder a miembros estáticos sin siquiera haber                   Aprenderemos a inicializar y utilizar
         instanciado una clase, para referenciarlos, utilizamos el nombre de la clase       arrays, matrices, e hipermatrices. Como
.
         con el . para acceder.
b                                                                                           referenciarlos y acceder a cada uno de
l          public class Generic {                                                           sus elementos.
o            static public int numero = 0;
           }
g                                                                                           Descubriremos bloques de inicialización
s          public class Specific extends Generic {                                          de clase y objeto.
p           static public int numero = 1;

o           static public void main (String[] args) {                                       Y conoceremos sobre las clases Wrapper
t            int tmp = Specific.numero; //Nomenclatura utilizada para acceder a             de Java que existen para cada tipo de
.          miembros estáticos (NombreClase.Miembro)
                                                                                            valor primitivo.
c              Generic c = new Specific(); //Es válido por el compilador. Utiliza los
o          miembros estáticos del tipo de dato declarado.
m              tmp = c.numero();      //En este caso, el valor al que se accede es el 0
             }
           }

         En caso de utilizar un identificador que no sea el nombre de la clase (una
         variable de referencia), se accede a los miembros estáticos del tipo declarado
         de la referencia (no el tipo real contenido).
Java World – Capítulo 2   18



                               h
                               t
                               t
                               p
                               :
                               /
                               /
                               g
                               u
                               s
                               t
                               a
                               v
                               o
                               a
                               l
                               b
                               e
                               r
                               o
                               l
                               a
                               .
                               b
                               l
                               o
                               g
                               s
                               p
                               o
                               t
                               .
                               c
                               o
                               m

Más contenido relacionado

La actualidad más candente

La actualidad más candente (19)

Anaga
AnagaAnaga
Anaga
 
Diagranacion periodico
Diagranacion periodicoDiagranacion periodico
Diagranacion periodico
 
Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012
 
Podemoscast
PodemoscastPodemoscast
Podemoscast
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011
 
Los reciclados y sus proyectos
Los reciclados y sus proyectosLos reciclados y sus proyectos
Los reciclados y sus proyectos
 
Monigote raro deforme
Monigote raro deformeMonigote raro deforme
Monigote raro deforme
 
Comic
ComicComic
Comic
 
Sistema heterogéneo
Sistema heterogéneo Sistema heterogéneo
Sistema heterogéneo
 
Moodle 1.9 Configuración del curso
Moodle 1.9  Configuración del cursoMoodle 1.9  Configuración del curso
Moodle 1.9 Configuración del curso
 
Malla vial Tunja
Malla vial TunjaMalla vial Tunja
Malla vial Tunja
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mcti
 
Xen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm TalkXen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm Talk
 
Triptico
TripticoTriptico
Triptico
 
Proporcion De Quejas
Proporcion De QuejasProporcion De Quejas
Proporcion De Quejas
 
Presentación atletismo
Presentación atletismoPresentación atletismo
Presentación atletismo
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de Bueu
 
Linea desarrollo institucional
Linea  desarrollo institucionalLinea  desarrollo institucional
Linea desarrollo institucional
 
Lopez
LopezLopez
Lopez
 

Similar a JavaWorld - SCJP - Capitulo 2

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworldevanlitos
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHoracio Germán García
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoElenaRaimundez
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisiondemonia28
 
Web enabled 2012
Web enabled 2012Web enabled 2012
Web enabled 2012Wiyingi
 
Folleto del museo_del_romanticismo
Folleto del museo_del_romanticismoFolleto del museo_del_romanticismo
Folleto del museo_del_romanticismoalvarpau
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardonaandercardona
 
1963 bar
1963 bar1963 bar
1963 baredusor
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardonaandercardona
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardonaandercardona
 

Similar a JavaWorld - SCJP - Capitulo 2 (16)

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworld
 
JavaWorld - SCJP - Capitulo 7
JavaWorld - SCJP - Capitulo 7JavaWorld - SCJP - Capitulo 7
JavaWorld - SCJP - Capitulo 7
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcía
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamiento
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervision
 
Web enabled 2012
Web enabled 2012Web enabled 2012
Web enabled 2012
 
Torre eiffel 2
Torre eiffel 2Torre eiffel 2
Torre eiffel 2
 
Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.
 
Folleto del museo_del_romanticismo
Folleto del museo_del_romanticismoFolleto del museo_del_romanticismo
Folleto del museo_del_romanticismo
 
Rotativo
RotativoRotativo
Rotativo
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardona
 
Yo me anticipo!!
Yo me anticipo!!Yo me anticipo!!
Yo me anticipo!!
 
Evaluación vs. calificación
Evaluación vs. calificaciónEvaluación vs. calificación
Evaluación vs. calificación
 
1963 bar
1963 bar1963 bar
1963 bar
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardona
 
Prueba única de informática anderson cardona
Prueba única de informática anderson cardonaPrueba única de informática anderson cardona
Prueba única de informática anderson cardona
 

Último

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 

Último (10)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 

JavaWorld - SCJP - Capitulo 2

  • 1.
  • 2. Java World – Capítulo 2 2 h t t p : / / g u s t a v o a l b e r o l a . b Agradecimientos l o Quisiera darle las gracias a Matias Emiliano Alvarez Durán (quien ahora será coautor de JavaWorld) por su aporte, y por darme g ese empujón que tanta falta me hacía. s Sin tu ayuda JavaWorld no hubiera visto nunca la luz. p Gracias o t . c o m
  • 3. 3 Java World – Capítulo 2 h Paradigmas de programación t t Para aquellos que son iniciados en el tema de la programación, es bueno tener en cuenta un poco la evolución en temas de cómo se p programa. : Desde siempre la programación fue una serie de algoritmos que resuelven un problema, lo que cambió, fue la manera de agrupar y asociar estos algoritmos. / / Paradigma estructural v a Este paradigma busca como objetivo dividir un problema complejo (sistema), en varios problemas menos complejos (funciones). l Este es un paradigma que ha ido quedando en desuso con el correr de los tiempos, aunque aquellos que estén dando sus primeros pasos en alguna institución, puede que lo vean en lenguajes como Pascal o C++. o r Paradigma orientado a objetos c r En este paradigma, cada elemento del sistema se divide en objetos. Estos son representaciones de entidades que encontramos en la e vida real. Por ejemplo, si estuviéramos diseñando un sistema para un aeropuerto, sería más que factible encontrarse con las clases Aeroplano, Pasajero, Capitan. a ¿Pero, y la diferencia? t En este paradigma, cada entidad es responsable de realizar las acciones que le conciernen, y solo las que le conciernen. i Supongamos que estamos diseñando un juego, y tenemos un avión, según los paradigmas hubiéramos hecho lo siguiente: v o Estrucura procedural en lenguaje C . typedef b struct Avion { int cantidadPasajerosSoportada; l float peso; o //... otras propiedades de un avion g } Avion_1; s public void volar(avion av) { p //... codigo o } t public void aterrizar(avion av) { . //...codigo c } o public main() { m volar(Avion_1) aterrizar(Avion_1) }
  • 4. Java World – Capítulo 2 4 Estructura orientada a objetos en Java class Avion { h int cantidadPasajerosSoportada; float peso; t //... otras propiedades de un avión t p public void volar() { //... Codigo : } / / public void aterrizar() { //... Codigo g } u } s static public void main(String[] args) { t Avion avion_01 = new Avion(); a avion_01.volar(); v avion_01.aterrizar(); } o a La diferencia más grande la podemos apreciar al momento de llamar a las acciones de volar y aterrizar. En el modelo estructural se llama a una función a la cal se le pasa un avión como argumento, pero en el modelo orientado a objetos, se le dice al propio avión l que vuele o aterrice. b e r o l a . b l o g s p o t . c o m
  • 5. 5 Java World – Capítulo 2 Definición de una clase h t public class Persona { t //Atributos String nombre; p String apellido; : int edad; / float peso; / //Constructores v public Persona(String nombre, String apellido) { a //Código ... } l o //Métodos r public void correr(){ //Código... c } r e public void caminar(){ //Código... a } t i public void hablar(){ v //Código... } o } . Básicamente, una clase contiene estos elementos: b l Atributos Definen el estado de un objeto o Métodos Definen el comportamiento (pueden ser de clase o de objeto) g Constructores Permiten crear objetos s Existen otros elementos que pertenecen a la clase, y no al objeto. Estos contienen el identificador static. p Pero no te preocupes, ya los veremos. o t Diferencia entre clase y objeto . Una clase representa una especie de molde para cada objeto. Cuando nosotros creamos un objeto, lo hacemos utilizando alguna c clase en particular, esto quiere decir que el objeto creado, puede realizar el comportamiento de la clase, y contiene todos sus o atributos. m Vamos a verlo con un ejemplo más gráfico. Utilicemos la clase Persona que definimos anteriormente. Basandonos en ella, podemos apreciar que cada Persona (clase), tendrá ciertas características (atributos). Por ejemplo, supongamos una persona llamada Gabriel y otra Laura.
  • 6. Java World – Capítulo 2 6 Clase Objetos h t Gabriel t Gabriel p : Persona Rarara / 15 / Nombre g Apellido 56.3 u s Edad Laura t Peso a Laura v o Momomo a 38 l b 65.2 e r o Al definir un objeto de tipo Persona estamos diciendole a la JVM que cree una estructura con tales propiedades y tal l comportamiento. En el ejemplo anterior, Laura y Gabriel también tienen la capacidad de correr(), caminar(), y hablar(). a . b Para todos aquellos que crean necesario y/o quieran profundizar en la programación orientada a objetos les l quisiera recomendar la siguiente bibliografía: Head First Java Es muy amigable, y contiene una manera de explicar todo con texto e imágenes o (permite mayor absorción de los conocimientos). La desventaja es que solo se encuentra en inglés. g Thinking in Java Es muy extenso y detallado, y hay una versión en castellano. La desventaja es que en s algunos momentos, puede llegar a ser un tanto abrumador. p Busquen en internet “programacion + objetos + java”. Este es un tema más que abarcado en la web, y o encontrarán mucha información al respecto. t . c o m
  • 7. 7 Java World – Capítulo 2 Más conceptos de la POO h t Al adentrarnos en este nuevo paradigma, no solamente cambia la manera de codificar, sino que se introducen varios conceptos que forman las bases de este, tales como encapsulamiento, polimorfismo y herencia. t p Encapsulamiento : / Algunos de los beneficios aportados por el paradigma de orientación a objetos (OO) son: flexibilidad y mantenimiento. Pero para / lograr esto, es necesario escribir las clases de una manera en particular. La clave para lograr esto es encapsular la lógica y el estado de la clase para que no pueda ser accedido de forma directa, y dejar de v manera publica un set de métodos para poder interactuar con la clase. a Las claves son: l o Siempre mantener las variables de instancia protegidas (con un modificador de acceso, generalmente public) r Crea métodos públicos (public) para acceder a las variables de instancia Para los anteriores, utiliza la convención de nombres de JavaBeans c r Herencia e a Cuando utilizamos la herencia, a veces es necesario saber si un objeto pertenece a una clase en concreto. Para realizar esto t utilizamos el operador instanceof, este devuelve un boolean, siendo true en caso de que pertenezca a dicha clase, falso en caso contrario. i objeto instanceof clase v Es posible crear relaciones de herencia en Java extendiendo una clase. Las dos características más comunes para utilizar la herencia o son: . b Para promover la reutilización del código Para el uso del polimorfismo l o El polimorfismo nos permite tratar una subclase como si fuera una clase del tipo de su superclase. La contrapartida de esto es que g solo se podrán llamar a los atributos que se encuentren disponibles para el tipo de clase declarada. s p Is-A o Para el examen es necesario saber: t . Is-A indica que la clase X es del tipo Y. Esto se logra a través de extends o implements. Al termino Is-A también se lo puede llamar: derived, subclass, inherits, o subtype. c A la superclase también se la conoce como “supeclase” o m Has-A Indica que una clase A tiene una variable de instancia que contiene una referencia a B. Polimorfismo Un objeto es polimórfico cuando cumple con al menos una condicios Is-A. Esto es cierto para todas las clases que no sean de tipo Object, ya que todas heredan de esta. La única manera de acceder a un objeto es a través de una variable de referencia. Algunas pautas para recordar de estas: Una variable de referencia puede ser de un solo tipo, y una vez que fue declarada, ese tipo jamás puede modificarse. Una referencia es una variable, de manera que puede ser reasignada a otros objetos (a menos que se declare como final).
  • 8. Java World – Capítulo 2 8 Un tipo de variable de referencia determina los métodos que pueden ser invocados sobre el objeto que la variable referencia. h Una variable de referencia puede tomar como referencia cualquier objeto del mismo tipo, o un subtipo del mismo. Una variable de referencia puede tener como tipo el de una interface. Si es declarada de esta manera, podrá contener t cualquier clase que implemente la interfaz. t p El concepto es que solo los métodos de instancia son invocados dinámicamente. Esto es logrado por la JVM, la cual siempre tiene : conocimiento de que tipo de objeto es el que se está tratando, así como su árbol de herencia. / Sobre escritura / g Cada vez que una clase hereda un método de su superclase, existe la posibilidad de sobrescribir el método (a menos que este haya u sido declarado con el modificador de no acceso final). El beneficio de la sobre escritura es la habilidad de definir comportamiento s particular para una clase específica. Características necesarias para hacer uso de la sobre escritura: t a La lista de argumentos debe ser exactamente igual que el método a sobrecargar. v El valor de retorno debe ser del mismo tipo, o un subtipo. o El modificador de acceso no puede ser más restrictivo que el del método a sobre escribir. a El modificador de acceso puede ser menos restrictivo que el método a sobre escribir. l Los métodos de instancia solo pueden ser sobre escritos si es que son heredados por la subclase. b El método sobre escrito puede lanzar cualquier excepción sin verificación en tiempo de ejecución, sin importar de las excepciones que hayan sido declaradas en el método de la superclase. e El método no deberá lanzar excepciones verificadas que son nuevas o amplían a las ya definidas por el método a sobre r escribir. o El método sobre escrito puede lanzar una cantidad menor de excepciones que las definidas en el método a sobre escribir. l No puedes sobre escribir un método que haya sido declarado como final (creo que es la 20ª vez que repetimos esto, a pero, nunca es suficiente). . No es posible sobre escribir un método que haya sido declarado como static. b Si un método no puede ser heredado, no puede ser sobre escrito. l Invocando la versión de la superclase de un método sobre escrito o g También es posible valerse del código definido en la superclase. La manera de invocarlo es con la palabra super (esta hace s referencia a la superclase). p En el caso de que un método sobre escrito no declare alguna excepción del método a sobre escribir, si se utiliza o como referencia el tipo de la superclase, se espera que pueda llegar a generarse la excepción. t . c o m
  • 9. 9 Java World – Capítulo 2 public class Generic { h public void doSomething() throws Exception { t // . . . some code here } t } p : public class Specific extends Generic { public void doSomething() { / // . . . some code here / } v } a public class Program { l static public void main ( String[] args ) { o Generic obj1 = new Specific(); Specific obj2 = new Specific(); r c obj2.doSomething(); r obj1.doSomething(); //Se genera un error de compilación, dado que no se declaro como recibir la excepción Exception e //El código podría solucionarse con un try-catch a try { t obj1.doSomething(); i } catch ( Exception ex ) { //. . . some code here v } o } . } b l Sobrecarga o La sobrecarga de métodos permite utilizar el mismo nombre de un método, el cual toma una cantidad y/o tipo de parámetros g diferentes. s Las reglas para la sobrecarga son: p o Deben de modificarse la lista de parámetros. Pueden modificar el tipo de valor de retorno. t Pueden cambiar el modificador de acceso. . Pueden declarar excepciones nuevas o más abarcativas. c Pueden ser sobrecargados en la misma clase, o en una subclase. o m Básicamente, un método sobrecargado no es más que un método completamente diferente, pero que utiliza un nombre que ya existe. Invocación de métodos sobrecargados Para invocar un método sobrecargado, es necesario especificar los parámetros del tipo esperado según el método que queramos invocar.
  • 10. Java World – Capítulo 2 10 public class Something { public void doSomething(int val) { h //. . . some code here } t t public void doSomething(float val) { p //. . . some code here } : / static public void main (String[] args){ / Something s1 = new Something(); g int valor1 = 1; u float valor2 = 2.3; s s1.doSomething(valor1); //Se invoca al método doSomething(int val) t s1.doSomething(valor2); //Se invoca al método doSomething(float val) a s1.doSomething(new Object); //Error de compilación. No existe ningún método que reciba como parámetro un tipo Object v } } o En el caso de la invocación con objetos, se vuelve un poco más complicado. a l public class Generic {} public class Specific extends Generic {} b e public class Program { r public void doSomething(Generic obj) { o //. . . some code here l } a public void doSomething(Specific obj) { . //. . . some code here b } l static public void main (String[] args) { o Generic obj1 = new Generic(); g Specific obj2 = new Specific(); s Generic obj3 = new Specific(); p Program p = new Program(); o t p.doSomething(obj1); //Se invoca al método doSomething(Generic obj) p.doSomething(obj2); //Se invoca al método doSomething(Specific obj) . p.doSomething(obj3); //Se invoca al método doSomething(Generic obj) c } o } m En el último caso, por más que obj3 sea de tipo Specific, la referencia contiene un tipo Generic, y es esta la que determina a que método se invoca.
  • 11. 11 Java World – Capítulo 2 Polimorfismo en sobre escritura y sobrecarga h t El polimorfismo no determina que método invocar cuando se trata de sobrecarga, pero si cuando se trata de sobre escritura. Tabla de diferenciación entre sobrecarga y sobre escritura: t Sobrecarga de método Sobre escritura de método p Parámetros Deben cambiar. No deben cambiar. : Valor de retorno Puede cambiar el tipo. No puede cambiar, salvo por alguna covariante (subclass). / Excepciones Pueden cambiar. Pueden reducirse o eliminarse. No se pueden lanzar nuevas / excepciones u otras más abarcativas. v Modificadores de Pueden cambiar No pueden ser más restrictivos (pueden ser menos restrictivos). a acceso Invocación El tipo de la referencia determina que El tipo del objeto determina que método invocar. Sucede en l método invocar. tiempo de ejecución. o r c r e a t i v o . b l o g s p o t . c o m
  • 12. Java World – Capítulo 2 12 Casteo de variables de referencia En ciertas ocasiones, es necesario utilizar un método de la clase específica (subclase), pero la referencia es de la superclase. En estos h casos se utiliza un casteo denominado downcast. El problema con este tipo de casteos, es que no generar errores en tiempo de t compilación, pero pueden generarlos en tiempo de ejecución. t public class Generic () { p public void doSomething() { : // . . . some code here / } } / g public class Specific (){ u public void doSomethingMoreSpecific() { // . . . some code here s } t } a public class Program { v static public void main (String[] args) { o Generic g1 = new Specific(); a Generic g2 = new Generic(); l g1.doSomething(); b g1.doSomethingMoreSpecific(); //Genera un error de compilación "cannot find symbol", esto indica que la clase Generic no e contiene un método doSomethingMoreSpecific r Specific s1 = (Specific)g1; s1.doSomethingMoreSpecific(); //En este caso, la instancia es de tipo Specific, de manera que conoce el método o doSomethingMoreSpecific l a g2.doSomething(); g2.doSomethingMoreSpecific(); //Genera un error de compilación "cannot find symbol", esto indica que la clase Generic no . contiene un método doSomethingMoreSpecific b s1 = (Specific)g2; //Se genera un error en tiempo de ejecución "java.lang.ClassCastException" l //Para prevenir esto en tiempo de ejecución, antes de realizar el downcast verificamos que el objeto sea del tipo a castear o if ( g2 instanceof Specific ) { //Como el objeto no es de tipo Specific, ni un subtipo del mismo, la sentencia if resulta false, y no g se entra en la condición, previniendo el error en tiempo de ejecución s s1 = (Specific)g2; s1.doSomethingMoreSpecific(); p //También se puede realizar un casteo directo como el siguiente o ((Specific)g2).doSomethingMoreSpecific(); t } } . } c Lo único que el compilador verifica es que el tipo de la variable con el tipo a castear se encuentren en el mismo árbol de herencia. o Lo que si puede generar un error de casteo es al intentar realizar un upcasting. m
  • 13. 13 Java World – Capítulo 2 public class Generic {} h public class Specific extends Generic{} t public class Another {} t public class Program { p static public void main (String[] args) { : Specific sp = new Specific(); Another an = new Another(); / / Generic s1 = (Generic)sp; v Generic an = (Generic)an; //Error de compilación al intentar realizar un upcasting "inconvertible types" a //El upcasting también se puede escribir de la siguiente manera l Generic s1 = sp; //Esta sintaxis automáticamente está realizando un upcasting o } } r c También, puede darse un caso como el planteado a continuación: r public interface Doable { e void doSomething(); } a t public class Generic implements Doable { i public void doSomething() { //. . . some code here v } o } . public class Specific extends Generic {} b La clase Specific puede ser tanto de tipo: Specific, Generic, o Doable, dado que su superclase la implementa, y ya se hizo l cargo de darle un cuerpo a los métodos definidos en la interfaz. o g s p o t . c o m
  • 14. Java World – Capítulo 2 14 Implementar (implements) una interfaz Cuando se implementa una interfaz, lo que se hace es aceptar el contrato provisto por esta, e implementarlo en la clase. Para el h compilador, lo único que requiere es que se le dé una implementación legal al método, pudiendo ser esta un cuerpo vacío por t ejemplo ({}). t Para que la implementación de una interfaz sea legal, la primer clase no abstracta del árbol de herencia debe cumplir con las p siguientes reglas: : Especificar una implementación concreta para todos los métodos definidos en el contrato de la interfaz. / Seguir todas las reglas para la sobre escritura de métodos. / Declarar sin excepciones controles sobre los métodos de ejecución distintos de los declarados por el método de interfaz, o g subclases de los declarados por el método de interfaz. u Mantener la misma firma del método, y devolver un valor del mismo tipo (o subtipo). s t a Tipos de valor de retorno válidos v o Esta sección implica dos cosas: a Lo que se puede declarar como un valor de retorno. l Qué tipo de dato se puede devolver realmente como valor de retorno. b e Declaración de tipos de valor de retorno (Return types declaration) r Esta sección indica que tipo de valor de retorno puedes escribir en la declaración del método, dependiendo si se trata de un método: o l Sobrecargado a Sobre escrito . Nuevo b Tipos de valor de retorno en métodos sobrecargados l o El tipo de valor de retorno puede ser cualquiera (el método debe calificar para la declaración de sobrecarga). g Tipos de valor de retorno en métodos sobre escritos s p Se puede especificar el mismo tipo, o un subtipo (sublass), como tipo de valor de retorno (el método debe calificar para la o declaración de sobre escritura). t NOTA: esto es posible a partir de Java 5, en versiones anteriores, solo es posible utilizar el mismo tipo. . Devolviendo un valor c o Solo existen seis reglas: m Puedes devolver un null cuando el tipo es un objeto. Un array representa un tipo de dato valido como retorno. En un método con un valor de retorno de tipo primitivo, es posible devolver un tipo de dato de otro tipo, que sea casteado implícitamente al tipo de retorno. Idem anterior con un tipo que puede ser casteado explícitamente (se debe realizar el cast antes de devolver el valor). Si el tipo es void, el método no puede contener ningún return. Si el tipo es un objeto, se puede devolver cualquier objeto que sea del mismo tipo o que pertenezca al árbol de herencia (no superclases ni superiores). Cualquier tipo que pase la condición instanceof del tipo de valor de retorno es válido.
  • 15. 15 Java World – Capítulo 2 Constructores e instanciación h t Los objetos son construidos. No es posible construir un nuevo objeto, sin antes invocar el constructor. Los constructores representan bloques de inicialización, los cuales pueden llegar a ser invocados con el operador new (no es el caso t de los bloques de inicialización estáticos). p : Conceptos básicos de los constructores (Constructor basics) / / Toda clase, incluidas aquellas que sean abstractas, deberán de tener un constructor. Pero esto no implica que el programador tenga que especificarlo. v a Llamadas en cadena a constructores (Constructor chaining) l o Suponiendo el siguiente árbol de herencia: r c Clase Clase Clase r Especifico Generico Objeto e a t i Al invocar la creación de un objeto de tipo Especifico, el proceso de inicialización es el siguiente: v 1. Se invoca el constructor se Especifico. Este invoca el constructor de Generico (esta invocación puede ser implícita o o explícita). . 2. Se invoca el constructor de Generico. Este invoca el constructor de Objeto (esta invocación es siempre implícita). b 3. Las variables de instancia del objeto Objeto reciben sus valores explícitos. l 4. Se ejecuta el constructor de Objeto. 5. Las variables de instancia del objeto Generico reciben sus valores explícitos. o 6. Se ejecuta el constructor de Generico. g 7. Las variables de instancia del objeto Especifico reciben sus valores por defecto. s 8. Se ejecuta el constructor de Especifico. p o Reglas de los constructores (Rules for constructors) t . Las siguientes reglas representan las bases de los constructores, y serán necesarias para rendir el examen. c o m Los constructores pueden utilizar cualquier modificador de acceso. El nombre del constructor debe ser igual al de la clase. Los constructores no deben de tener un valor de retorno. Es legal tener un método que tenga el mismo nombre que la clase. Siempre que este tenga un valor de retorno, es un método. Si no se especifica explícitamente un constructor en la clase, implícitamente se genera un constructor que no recibe parámetros. Si se especifica al menos un constructor, el constructor implícito no será generado, de manera que si es necesario un constructor con argumentos, y el por defecto, es necesario especificarlo explícitamente. Todos los constructores tienen en la primer línea, una llamada a un constructor sobrecargado (this()), o una llamada a un constructor de la superclase (super()).
  • 16. Java World – Capítulo 2 16 La llamada a un constructor de la superclase puede ser con o sin argumentos. Un constructor sin argumentos no es necesariamente un constructor por defecto (este es el que especifica el compilador, h en caso de no declarar explícitamente ningún constructor). No es posible acceder a una variable de instancia, o método de instancia, hasta que se ejecute el constructor de la t superclase. t Solo variables y/o métodos estáticos pueden ser llamados al invocar un constructor mediante this() o super(). p Las clases abstractas también tienen constructores, y estos son ejecutados cuando se instancie una subclase. : Las interfaces no tienen constructores. Las interfaces no forman parte del árbol de herencia. / La única manera de invocar un constructor es desde otro constructor. / Determinar cuándo se creará el constructor por defecto g u El constructor por defecto será creado por el compilador, siempre que no se haya declarado ningún constructor en la clase. s t Como es el constructor por defecto? a Tiene el mismo modificador de acceso que la clase. v No recibe ningún argumento (no tiene parámetros en su definición). o Llama al constructor de la superclase sin argumentos. a l Qué pasa si el constructor de la superclase requiere argumentos? b Es necesario crear explícitamente los constructores en la clase, y dentro de la implementación de estos, llamar al e constructor de la superclase pasando los argumentos necesarios. r o Sobrecarga de constructores l Simplemente se comporta al igual que los métodos. Para sobrecargar un constructor basta con declarar varios de estos con a diferentes parámetros. . b l Regla absoluta de los constructores. La primer línea de estos deberá ser una llamada a super() o this() o (pueden contener parámetros en la llamada, siempre que la llamada no la realice el compilador). g s Alguno de los constructores de la clase deberá de llamar a super(), y verificar que todos los demás constructores terminen yendo p al que realiza dicha llamada. o t . c o m
  • 17. 17 Java World – Capítulo 2 Métodos y variables estáticos h t Todos los métodos y atributos declarados con el modificador de no acceso static pertenecen a la clase y no al objeto (instancia de la clase). t Para saber cuándo debemos deberíamos de crear un atributo o método p estático, simplemente necesitamos saber si este requiere o no acceder a : algún atributo de la clase (en el caso de los métodos), o si debe ser un valor / compartido para todos los objetos (en el caso de los atributos). / Características de los atributos y métodos estáticos: v No es necesario inicializar ningún objeto para poder acceder a estos. a Los atributos estáticos son compartidos por todos los objetos (en l realidad son de la clase, y dado que el objeto pertenece a dicha clase, Lo que se viene o también tiene acceso a los atributos y métodos de esta). En la próxima entrega estaremos r Las variables estáticas tienen la misma inicialización por defecto que adentrándonos en las asignaciones. c las variables de clase. r Un método estático no puede acceder a ningún miembro no estático (main es estático!). Veremos que clases de literales existen e No existe la sobre escritura (overriding) de métodos estáticos, pero si en el mundo de Java, y como utilizar a la sobrecarga (overloading). cada uno de ellos, así como sus t compatiblidades e incompatibilidades. i Accediendo a métodos y variables estáticas v o Dado que podemos acceder a miembros estáticos sin siquiera haber Aprenderemos a inicializar y utilizar instanciado una clase, para referenciarlos, utilizamos el nombre de la clase arrays, matrices, e hipermatrices. Como . con el . para acceder. b referenciarlos y acceder a cada uno de l public class Generic { sus elementos. o static public int numero = 0; } g Descubriremos bloques de inicialización s public class Specific extends Generic { de clase y objeto. p static public int numero = 1; o static public void main (String[] args) { Y conoceremos sobre las clases Wrapper t int tmp = Specific.numero; //Nomenclatura utilizada para acceder a de Java que existen para cada tipo de . miembros estáticos (NombreClase.Miembro) valor primitivo. c Generic c = new Specific(); //Es válido por el compilador. Utiliza los o miembros estáticos del tipo de dato declarado. m tmp = c.numero(); //En este caso, el valor al que se accede es el 0 } } En caso de utilizar un identificador que no sea el nombre de la clase (una variable de referencia), se accede a los miembros estáticos del tipo declarado de la referencia (no el tipo real contenido).
  • 18. Java World – Capítulo 2 18 h t t p : / / g u s t a v o a l b e r o l a . b l o g s p o t . c o m