Anonymous Inner Classes, Flavor Two

Download Report

Transcript Anonymous Inner Classes, Flavor Two

Inner classes
CAPITULO 8
• Por favor no descomentar el codigo hasta segunda
order.
• Gracias por su compresion.
Regular inner classes
• Inner classes que no son:
o
o
o
Static
Method-Local
Anonymous
• Las inner clases pueden ver todos los metodos y
atributos de la clase exterior inclusive aquellos
marcados como private.
Regular Inner classes
• Las clases Inner no pueden tener ningun tipo de
declaracion “Static” por lo tanto no pueden ejecutar
el metodo main.
Instanciando una InnerClass
• Regla general:
o
Para acceder a una inner clase, la unica manera de hacerlo es
instanciando la outer class. Sin embargo, si se puede
instanciar de manera normal una inner class desde la clase
externa.
o
Ver InstanciandoInner.java
Referenciando la clase Outer o Inner desde la
InnerClass
• Como se referencia a un objeto? Con la palabra
This.
• Lo mismo es con las inner class.
• Para la outer class se referencia de esta manera
ClassName.this
• Ver: InnerClassReference.java
Modificadores de acceso aplicados a inner class
• Pueden ser los siguientes:
 Final
 Abstract
 Public
 Private
 Protected
 Strictfp
 Static (pero static hace que la clase ya no sea
inner class)
Inner Class desde metodos locales
• Tambien se puede definir una inner class desde un
metodo.
• Pero una inner class declarada de esta forma, solo
puede ser instanciada dentro del metodo donde se
creo la inner class
• Ver MethodLocalInnerClass.java
Inner Class desde metodos locales
• De igual manera las inner class creadas en un
metodo pueden ver y acceder a los atributos y
metodos de la outer; sin embargo no pueden
compartir nada con las variables declaradas en el
metodo donde estan contenidas.
• Porque? Ahí los quiero ver…
Inner Class desde metodos locales
• Los modificadores de acceso de una inner class son
los mismos modificadores que tiene una variable de
metodo, es decir solo puede ser final o abstract.
• Exam Watch!
o
Las inner class declaradas dentro de metodos estaticos solo
pueden acceder a miembros estaticos de la clase outer, y
nada mas..
Inner Class Anonimas
• Viene en tres tipo diferentes:
• Plain-Old Anonymous Inner Classes, Flavor One
• Plain-Old Anonymous Inner Classes, Flavor Two
• Argument-Defined Anonymous Inner Classes
Inner Class Anonimas(Flavor One)
• Ver archivo FlavorOne.java
Inner Class Anonimas(Flavor One)
• Lo que se hace en realidad es definir un subtipo de la
clase PopCorn pero que no tiene nombre.
• Es decir, es casi como crear una clase y hacerla
extender de PopCorn.
• La idea de este tipo de inner class es de redefinir uno
o varios metodos de la superclase.
Inner Class Anonimas(Flavor One)
• Exam Watch !
• The closing semicolon is hard to spot. Watch for
code like this:
Popcorn p = new Popcorn() {
public void pop() { }
} // aqui falta el ;
Foo f = new Foo();
Inner Class Anonimas(Flavor One)
• Anonymous Inner Classes tiene que todo con
polimorfismo ya que lo que se hace es crear un
subtipo que no tiene nombre.
• Ver: FlavorOnePolimorphism.java
Anonymous Inner Classes, Flavor Two
• La diferencia entre el FlavorOne y el FlavorTwo es
que el primero define una subclase anonima para el
supertipo mientras que el segundo define un
implementador anonimo para la interface dada.
Anonymous Inner Classes, Flavor Two
• Exam Watch!
• Lo siguiente es ilegal
• Runnable r = new Runnable (); // can't instantiate interface
• Pero lo siguiente no: Pilas con esto
• Runnable r = new Runnable() { public void run() { } };
Argument-Defined Anonymous Inner Classes
• Significa crear inner class anónimas como
parámetros de una función.
• Por ejemplo cuando tenemos como argumento de
una función a una interface.
• Ver: ArgumentDefinedInnerClasses.java
Static Nested Classes
• No son en si inner class en si mismo, lo único que
quieren decir es que, como cualquier miembro
estático de una clase; este puede ser accesado sin
necesidad de tener una instancia de la clase outer.
• Ver: StaticNestedClasses.java
Static Nested Classes
• Watch Exam!
• Así como los métodos estáticos, las static nested
classes tampoco tienen acceso a los miembros no
estáticos de la outer class, es decir variables de
instancia ni métodos.