SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
SCJP 6
  Clase 8 – Inner Classes




    Ezequiel Aranda
Sun Microsystems Campus
      Ambassador
Disclaimer & Acknowledgments
>!Even though Ezequiel Aranda is a full-time employee of Sun
  Microsystems, the contents here are created as his own
  personal endeavor and thus does not reflect any official
  stance of Sun Microsystems.
>!Sun Microsystems is not responsible for any inaccuracies in
  the contents.
>!Acknowledgments – The slides of this presentation are made
  from “SCJP Unit 8” by Warit Wanwithu and Thanisa
  Kruawaisayawan and SCJP Workshop by P. Srikanth.
>!This slides are Licensed under a Creative Commons
  Attribution – Noncommercial – Share Alike 3.0
   >!http://creativecommons.org/licenses/by-nc-sa/3.0/
AGENDA

>! enerics Vs. Arrays
 G
>! lases internas
 C
  >! lases internas “regulares”
   C
  >! lases internas locales a un método
   C
  >! lases internas anónimas
   C
  >! lases estáticas anidadas
   C
Generics Vs. Arrays

                  Animal

             <<abs>> checkup()




!"#$%              &'(%          )*+%
Generics Vs. Arrays (II)
  public void checkAnimals(ArrayList<Animal>
    animals){
      for(Animal a : animals) {
          a.checkup();
      }
  }
  doc.checkAnimals(dogs);    // dogs: List<Dog>
  doc.checkAnimals(cats);    // cats: List<Cat>
  doc.checkAnimals(birds); // birds: List<Bird>

>! Porqué no funciona?
 ¿
>! Cómo solucionarlo?
 ¿
Generics Vs. Arrays (III)
  Animal[] animals = new Animal[3];
  animals[0] = new Cat();
  animals[1] = new Dog();
  List<Animal> animals = new
    ArrayList<Animal>();
  animals.add(new Cat());    // OK
  animals.add(new Dog());    // OK

>! sto funciona con ambos, Arrays y Generics.
 E
Generics Vs. Arrays (IV)


>! unciona siempre:
 F
  public void addAnimal(Animal[] animals) {
  animals[0] = new Dog(); Animal[]
  }

>! unciona a veces:
 F
  public void addAnimal(ArrayList<Animal>
    animals) {
  animals.add(new Dog());
  }
Generics Vs. Arrays (V)

>! a razón por la cual es peligroso pasar como
 L
 parámetro una colección de un subtipo es
 porque podríamos agregar algo erróneo en la
 colección (o en el Array).
Generics Vs. Arrays (VI)
  public void foo() {
  Dog[] dogs = {new Dog(), new Dog()};
    addAnimal(dogs);
  }
  public void addAnimal(Animal[] animals) {
  animals[0] = new Dog();
  }

>! sto funciona perfectamente, y es correcto.
 E
Generics Vs. Arrays (VII)
  public void foo() {
  Cat[] cats = {new Cat(), new Cat()};
    addAnimal(cats);
  }
  public void addAnimal(Animal[] animals) {
  animals[0] = new Dog();
  }

>! cabamos de poner un gato en un Array de
 A
 perros.
Generics Vs. Arrays (VIII)

>! in embargo, y a diferencia que realizando
 S
 el mismo ejemplo con colecciones
 parametrizadas, el código anterior, compila
>! o que permite que compile es la existencia
 L
 de la excepción ArrayStoreException, que
 previene que se de el problema visto
 anteriormente en tiempo de ejecución.
Generics Vs. Arrays (IX)

>! ero no existe un equivalente
 P
 a esta excepción para
 colecciones, debido a que las
 parametrizaciones se eliminan
 en tiempo de ejecución.
>! s decir, la JVM conoce el tipo de los Arrays
 E
 en tiempo de ejecución, pero no el tipo de
 una colección.
Codificando una inner class “regular”

>! lamamos regulares a las clases internas que
 L
 no son:
  >! státicas
   E
  >! ocales a un método
   L
  >! nónimas
   A
>! na inner class regular no puede tener
 U
 declaraciones estáticas de ningún tipo
>! a única forma de acceder a la clase interna
 L
 es a través de una instancia de la clase
 externa.
class MyOuter {
      private int x = 7;
      class MyInner {
      public void seeOuter() {
        System.out.println("Outer x is
        " + x); }}
  }
>! ste código es perfectamente legal. Nótese
 E
 que la clase interna esta accediendo a un
 miembro privado de la clase externa. Esto es
 correcto, dado que la clase interna es un
 miembro de la clase externa también.
Instanciando una clase interna
>! esde el interior de la clase externa:
 D
  MyInner mi = new MyInner();
>! esde el exterior de la clase externa
 D
 (incluyendo código de métodos estáticos
 dentro de la clase externa):
  MyOuter.MyInner
>! ara instanciar un objeto de la clase interna
 P
 debemos usar una referencia a la clase
 externa:
  obj = new MyOuter().new MyInner();
    u outerObjRef.new MyInner();
this

>! this” es una referencia al objeto que esta en
 “
 ejecución actualmente.
  public void myMethod() {
      MyClass mc = new MyClass();
      mc.doStuff(this);
  }
Haciendo referencia a la instancia de la clase
      interna/ externa desde la clase interna
class MyOuter {
    private int x = 7;
    class MyInner {
     public void seeOuter() {
         System.out.println("Outer x is "+ x);
         System.out.println("Inner class ref is
         ” + this);
         System.out.println("Outer class ref is
         ” + MyOuter.this);
     }
    }
}
Clases internas locales a un método
class MyOuter2 {
    private String x = "Outer2";
    void doStuff() {
     class MyInner {
     public void seeOuter() {
         System.out.println("Outer x is " + x);
     }
    }
    MyInner mi = new MyInner();
    mi.seeOuter(); }
}
Que puede y que no puede hacer una clase
           local a un método
>! efiniendo una clase interna dentro de un
 D
 método, solo podremos crear objetos de esa
 clase dentro del método.
>! uede ser una clase abstracta.
 P
>! o puede tener métodos o atributos estáticos
 N
 salvo que la clase interna sea estática
 también.
Que puede y que no puede hacer una
    clase local a un método (II)
>! uede acceder a las variables de la clase
 P
 externa.
>! o puede acceder a las variables locales al
 N
 método.
  >! alvo que sean declaradas “final”
   S
>! os únicos modificadores que podemos
 L
 aplicar a una clase interna local a un método
 son “abstract” y “final”.
  >! omo siempre, no podemos aplicar los dos al
   C
   mismo tiempo.
Que puede y que no puede hacer una
    clase local a un método (III)
class MyOuter2 {
  private String x = "Outer2";
  void doStuff() {
   String z = "local variable";
   class MyInner {
      public void seeOuter() {
          System.out.println("Outer x is " + x);
          System.out.println("Local variable z
          is"+ z);
// Esto no compila. Dado que se accede a z desde la
  clase interna, z debe ser declarada final.
} } } }
Clases internas anónimas
   class Popcorn {
     public void pop() {
       System.out.println("popcorn");
     }
   }
   class Food {
     Popcorn p = new Popcorn() {
       public void pop() {
          System.out.println("anonymous popcorn");
       }
     }; // debe colocarse un punto y coma aquí
   }
>!La variable p no hace referencia a una instancia de
  Popcorn, sino a una instancia de una subclase
  anónima de Popcorn.
class Popcorn {
  public void pop() {
    System.out.println("popcorn");
  }
}
  class Food {
    Popcorn p = new Popcorn() {
       public void sizzle() {
          System.out.println("anonymous sizzling
          popcorn");
       }
       public void pop() {
          System.out.println("anonymous popcorn");
       }
    };
    public void popIt() {
       p.pop(); // OK
       p.sizzle(); //KO    ¿Porqué no funciona?
    }}
Clases internas anónimas:
         implementando una interfaz
interface Cookable {
    public void cook();
}
class Food {
    Cookable c = new Cookable() {
     public void cook() {
         System.out.println("anonymous cookable
         implementer");
     }
  }; Nota: no existe un mecanismo para implementar mas
}    de una interfaz de esta forma
class MyWonderfulClass {    Clases internas anónimas:
   void go() {                  clases definidas en
     Bar b = new Bar();             argumentos
     b.doStuff(new Foo() {
        public void foof() {
           System.out.println("foofy");
        } // fin foof
     }); //fin inner class y declaración del método
   } // fin go()
} // fin class
interface Foo {
   void foof();
}
class Bar {
   void doStuff(Foo f) { }
}
Clases estáticas anidadas
class BigOuter {
  static class Nest {
    void go(){System.out.println("hi"); } }
}
class Broom {
  static class B2 {
    void goB2(){System.out.println("hi 2"); }
  }
  public static void main(String[] args) {
    BigOuter.Nest n = new BigOuter.Nest();
    n.go();
    B2 b2 = new B2();
    b2.goB2(); }}
Clases estáticas anidadas (II)

>!Las clases no son exactamente “estáticas”. No existe
  tal cosa.
>!En este caso el modificador “static” indica que la
  clase interna es un miembro estático de la clase
  externa.
>!Esto quiere decir que podemos acceder al mismo sin
  la necesidad de crear una instancia de la clase
  externa.
>!No puede acceder a los miembros de la clase
  externa de la misma forma que lo haría una clase
  interna (exceptuando a los estáticos, claro está).
Preguntas

Contenu connexe

Tendances

Constructores en java(grupo 8)
Constructores en java(grupo 8)Constructores en java(grupo 8)
Constructores en java(grupo 8)Manuel Ch.
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collectionsflekoso
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Robert Wolf
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosjubacalo
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESAnaid03
 
Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datosjubacalo
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc X
 
Metodos Constructor Y Destructor
Metodos Constructor Y DestructorMetodos Constructor Y Destructor
Metodos Constructor Y Destructorrezzaca
 
EXCEPCIONES JAVA
EXCEPCIONES JAVAEXCEPCIONES JAVA
EXCEPCIONES JAVAmellcv
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcionalJuan Rodríguez
 
Java exceptions
Java exceptionsJava exceptions
Java exceptionssandropaul
 
Java exceptions
Java exceptionsJava exceptions
Java exceptionsDeli_amor
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc X
 
Programación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresProgramación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresAlvaro Enrique Ruano
 

Tendances (20)

Constructores en java(grupo 8)
Constructores en java(grupo 8)Constructores en java(grupo 8)
Constructores en java(grupo 8)
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collections
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETES
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Comandos de Java
Comandos de JavaComandos de Java
Comandos de Java
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
 
Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datos
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcaciones
 
Programación Java
Programación JavaProgramación Java
Programación Java
 
Metodos Constructor Y Destructor
Metodos Constructor Y DestructorMetodos Constructor Y Destructor
Metodos Constructor Y Destructor
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
EXCEPCIONES JAVA
EXCEPCIONES JAVAEXCEPCIONES JAVA
EXCEPCIONES JAVA
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
 
Java exceptions
Java exceptionsJava exceptions
Java exceptions
 
Java exceptions
Java exceptionsJava exceptions
Java exceptions
 
Semana 4 Javascript funciones y Metodos
Semana 4   Javascript funciones y MetodosSemana 4   Javascript funciones y Metodos
Semana 4 Javascript funciones y Metodos
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 bucles
 
Programación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresProgramación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructores
 

En vedette

天主教会史(第四部分)
天主教会史(第四部分)天主教会史(第四部分)
天主教会史(第四部分)Suifeng_Joseph
 
教宗 拉辛格 礼仪之精神
教宗 拉辛格 礼仪之精神 教宗 拉辛格 礼仪之精神
教宗 拉辛格 礼仪之精神 Suifeng_Joseph
 
天主教会史(第一部分)
天主教会史(第一部分)天主教会史(第一部分)
天主教会史(第一部分)Suifeng_Joseph
 
天主教会史(第二部分)
天主教会史(第二部分)天主教会史(第二部分)
天主教会史(第二部分)Suifeng_Joseph
 
Satellite
SatelliteSatellite
Satellitesharif5
 
Clase9 threads
Clase9 threadsClase9 threads
Clase9 threadsjorg_marq
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectivesjorg_marq
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collectionsjorg_marq
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignacionesjorg_marq
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 genericsjorg_marq
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadoresjorg_marq
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujojorg_marq
 
RHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRadien software
 

En vedette (15)

Poverty
PovertyPoverty
Poverty
 
Portada
PortadaPortada
Portada
 
天主教会史(第四部分)
天主教会史(第四部分)天主教会史(第四部分)
天主教会史(第四部分)
 
教宗 拉辛格 礼仪之精神
教宗 拉辛格 礼仪之精神 教宗 拉辛格 礼仪之精神
教宗 拉辛格 礼仪之精神
 
天主教会史(第一部分)
天主教会史(第一部分)天主教会史(第一部分)
天主教会史(第一部分)
 
天主教会史(第二部分)
天主教会史(第二部分)天主教会史(第二部分)
天主教会史(第二部分)
 
Satellite
SatelliteSatellite
Satellite
 
Clase9 threads
Clase9 threadsClase9 threads
Clase9 threads
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectives
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collections
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignaciones
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 generics
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadores
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujo
 
RHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRHCE FINAL Questions and Answers
RHCE FINAL Questions and Answers
 

Similaire à Clase8 innerclasses

SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classesflekoso
 
JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxFamiliaAyluardo
 
Sesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clasesSesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clasesecodereck
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009mtemarialuisa
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3Juan Cardona
 
Clases anidadas en www.fiec.espol.edu.ec
Clases anidadas  en www.fiec.espol.edu.ecClases anidadas  en www.fiec.espol.edu.ec
Clases anidadas en www.fiec.espol.edu.ecSilvana Vargas
 
2.android java
2.android   java2.android   java
2.android javaguidotic
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2climancc
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESJosee Olveeda
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en phpRobert Moreira
 

Similaire à Clase8 innerclasses (20)

SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classes
 
JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptx
 
Clase 4 JAVA 2012
Clase 4 JAVA 2012Clase 4 JAVA 2012
Clase 4 JAVA 2012
 
Clase 4 java 2011
Clase 4 java 2011Clase 4 java 2011
Clase 4 java 2011
 
Sesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clasesSesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clases
 
Herencia
HerenciaHerencia
Herencia
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3
 
Clases anidadas en www.fiec.espol.edu.ec
Clases anidadas  en www.fiec.espol.edu.ecClases anidadas  en www.fiec.espol.edu.ec
Clases anidadas en www.fiec.espol.edu.ec
 
Java
JavaJava
Java
 
9.herencia en java
9.herencia en java9.herencia en java
9.herencia en java
 
2.android java
2.android   java2.android   java
2.android java
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETES
 
Introduccion lenguaje java
Introduccion lenguaje javaIntroduccion lenguaje java
Introduccion lenguaje java
 
Semana 3 Herencia en Java
Semana 3   Herencia en JavaSemana 3   Herencia en Java
Semana 3 Herencia en Java
 
Introduccio al Java
Introduccio al JavaIntroduccio al Java
Introduccio al Java
 
Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en php
 
Metodos 2
Metodos 2Metodos 2
Metodos 2
 

Plus de jorg_marq

Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoojorg_marq
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcursojorg_marq
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10jorg_marq
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsiojorg_marq
 
Whither cman
Whither cmanWhither cman
Whither cmanjorg_marq
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectivesjorg_marq
 

Plus de jorg_marq (13)

Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoo
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcurso
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10
 
Capitulo 7
Capitulo 7Capitulo 7
Capitulo 7
 
Capitulo 6
Capitulo 6Capitulo 6
Capitulo 6
 
Capitulo 5
Capitulo 5Capitulo 5
Capitulo 5
 
Capitulo 4
Capitulo 4Capitulo 4
Capitulo 4
 
Capitulo 3
Capitulo 3Capitulo 3
Capitulo 3
 
Capitulo 2
Capitulo 2Capitulo 2
Capitulo 2
 
Capitulo 1
Capitulo 1Capitulo 1
Capitulo 1
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsio
 
Whither cman
Whither cmanWhither cman
Whither cman
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectives
 

Clase8 innerclasses

  • 1. SCJP 6 Clase 8 – Inner Classes Ezequiel Aranda Sun Microsystems Campus Ambassador
  • 2. Disclaimer & Acknowledgments >!Even though Ezequiel Aranda is a full-time employee of Sun Microsystems, the contents here are created as his own personal endeavor and thus does not reflect any official stance of Sun Microsystems. >!Sun Microsystems is not responsible for any inaccuracies in the contents. >!Acknowledgments – The slides of this presentation are made from “SCJP Unit 8” by Warit Wanwithu and Thanisa Kruawaisayawan and SCJP Workshop by P. Srikanth. >!This slides are Licensed under a Creative Commons Attribution – Noncommercial – Share Alike 3.0 >!http://creativecommons.org/licenses/by-nc-sa/3.0/
  • 3. AGENDA >! enerics Vs. Arrays G >! lases internas C >! lases internas “regulares” C >! lases internas locales a un método C >! lases internas anónimas C >! lases estáticas anidadas C
  • 4. Generics Vs. Arrays Animal <<abs>> checkup() !"#$% &'(% )*+%
  • 5. Generics Vs. Arrays (II) public void checkAnimals(ArrayList<Animal> animals){ for(Animal a : animals) { a.checkup(); } } doc.checkAnimals(dogs); // dogs: List<Dog> doc.checkAnimals(cats); // cats: List<Cat> doc.checkAnimals(birds); // birds: List<Bird> >! Porqué no funciona? ¿ >! Cómo solucionarlo? ¿
  • 6. Generics Vs. Arrays (III) Animal[] animals = new Animal[3]; animals[0] = new Cat(); animals[1] = new Dog(); List<Animal> animals = new ArrayList<Animal>(); animals.add(new Cat()); // OK animals.add(new Dog()); // OK >! sto funciona con ambos, Arrays y Generics. E
  • 7. Generics Vs. Arrays (IV) >! unciona siempre: F public void addAnimal(Animal[] animals) { animals[0] = new Dog(); Animal[] } >! unciona a veces: F public void addAnimal(ArrayList<Animal> animals) { animals.add(new Dog()); }
  • 8. Generics Vs. Arrays (V) >! a razón por la cual es peligroso pasar como L parámetro una colección de un subtipo es porque podríamos agregar algo erróneo en la colección (o en el Array).
  • 9. Generics Vs. Arrays (VI) public void foo() { Dog[] dogs = {new Dog(), new Dog()}; addAnimal(dogs); } public void addAnimal(Animal[] animals) { animals[0] = new Dog(); } >! sto funciona perfectamente, y es correcto. E
  • 10. Generics Vs. Arrays (VII) public void foo() { Cat[] cats = {new Cat(), new Cat()}; addAnimal(cats); } public void addAnimal(Animal[] animals) { animals[0] = new Dog(); } >! cabamos de poner un gato en un Array de A perros.
  • 11. Generics Vs. Arrays (VIII) >! in embargo, y a diferencia que realizando S el mismo ejemplo con colecciones parametrizadas, el código anterior, compila >! o que permite que compile es la existencia L de la excepción ArrayStoreException, que previene que se de el problema visto anteriormente en tiempo de ejecución.
  • 12. Generics Vs. Arrays (IX) >! ero no existe un equivalente P a esta excepción para colecciones, debido a que las parametrizaciones se eliminan en tiempo de ejecución. >! s decir, la JVM conoce el tipo de los Arrays E en tiempo de ejecución, pero no el tipo de una colección.
  • 13. Codificando una inner class “regular” >! lamamos regulares a las clases internas que L no son: >! státicas E >! ocales a un método L >! nónimas A >! na inner class regular no puede tener U declaraciones estáticas de ningún tipo >! a única forma de acceder a la clase interna L es a través de una instancia de la clase externa.
  • 14. class MyOuter { private int x = 7; class MyInner { public void seeOuter() { System.out.println("Outer x is " + x); }} } >! ste código es perfectamente legal. Nótese E que la clase interna esta accediendo a un miembro privado de la clase externa. Esto es correcto, dado que la clase interna es un miembro de la clase externa también.
  • 15. Instanciando una clase interna >! esde el interior de la clase externa: D MyInner mi = new MyInner(); >! esde el exterior de la clase externa D (incluyendo código de métodos estáticos dentro de la clase externa): MyOuter.MyInner >! ara instanciar un objeto de la clase interna P debemos usar una referencia a la clase externa: obj = new MyOuter().new MyInner(); u outerObjRef.new MyInner();
  • 16. this >! this” es una referencia al objeto que esta en “ ejecución actualmente. public void myMethod() { MyClass mc = new MyClass(); mc.doStuff(this); }
  • 17. Haciendo referencia a la instancia de la clase interna/ externa desde la clase interna class MyOuter { private int x = 7; class MyInner { public void seeOuter() { System.out.println("Outer x is "+ x); System.out.println("Inner class ref is ” + this); System.out.println("Outer class ref is ” + MyOuter.this); } } }
  • 18. Clases internas locales a un método class MyOuter2 { private String x = "Outer2"; void doStuff() { class MyInner { public void seeOuter() { System.out.println("Outer x is " + x); } } MyInner mi = new MyInner(); mi.seeOuter(); } }
  • 19. Que puede y que no puede hacer una clase local a un método >! efiniendo una clase interna dentro de un D método, solo podremos crear objetos de esa clase dentro del método. >! uede ser una clase abstracta. P >! o puede tener métodos o atributos estáticos N salvo que la clase interna sea estática también.
  • 20. Que puede y que no puede hacer una clase local a un método (II) >! uede acceder a las variables de la clase P externa. >! o puede acceder a las variables locales al N método. >! alvo que sean declaradas “final” S >! os únicos modificadores que podemos L aplicar a una clase interna local a un método son “abstract” y “final”. >! omo siempre, no podemos aplicar los dos al C mismo tiempo.
  • 21. Que puede y que no puede hacer una clase local a un método (III) class MyOuter2 { private String x = "Outer2"; void doStuff() { String z = "local variable"; class MyInner { public void seeOuter() { System.out.println("Outer x is " + x); System.out.println("Local variable z is"+ z); // Esto no compila. Dado que se accede a z desde la clase interna, z debe ser declarada final. } } } }
  • 22. Clases internas anónimas class Popcorn { public void pop() { System.out.println("popcorn"); } } class Food { Popcorn p = new Popcorn() { public void pop() { System.out.println("anonymous popcorn"); } }; // debe colocarse un punto y coma aquí } >!La variable p no hace referencia a una instancia de Popcorn, sino a una instancia de una subclase anónima de Popcorn.
  • 23. class Popcorn { public void pop() { System.out.println("popcorn"); } } class Food { Popcorn p = new Popcorn() { public void sizzle() { System.out.println("anonymous sizzling popcorn"); } public void pop() { System.out.println("anonymous popcorn"); } }; public void popIt() { p.pop(); // OK p.sizzle(); //KO ¿Porqué no funciona? }}
  • 24. Clases internas anónimas: implementando una interfaz interface Cookable { public void cook(); } class Food { Cookable c = new Cookable() { public void cook() { System.out.println("anonymous cookable implementer"); } }; Nota: no existe un mecanismo para implementar mas } de una interfaz de esta forma
  • 25. class MyWonderfulClass { Clases internas anónimas: void go() { clases definidas en Bar b = new Bar(); argumentos b.doStuff(new Foo() { public void foof() { System.out.println("foofy"); } // fin foof }); //fin inner class y declaración del método } // fin go() } // fin class interface Foo { void foof(); } class Bar { void doStuff(Foo f) { } }
  • 26. Clases estáticas anidadas class BigOuter { static class Nest { void go(){System.out.println("hi"); } } } class Broom { static class B2 { void goB2(){System.out.println("hi 2"); } } public static void main(String[] args) { BigOuter.Nest n = new BigOuter.Nest(); n.go(); B2 b2 = new B2(); b2.goB2(); }}
  • 27. Clases estáticas anidadas (II) >!Las clases no son exactamente “estáticas”. No existe tal cosa. >!En este caso el modificador “static” indica que la clase interna es un miembro estático de la clase externa. >!Esto quiere decir que podemos acceder al mismo sin la necesidad de crear una instancia de la clase externa. >!No puede acceder a los miembros de la clase externa de la misma forma que lo haría una clase interna (exceptuando a los estáticos, claro está).