{"id":1724,"date":"2013-07-09T16:03:14","date_gmt":"2013-07-09T21:03:14","guid":{"rendered":"http:\/\/alejandroayala.solmedia.ec\/?p=1724"},"modified":"2014-08-11T15:31:15","modified_gmt":"2014-08-11T20:31:15","slug":"resumen-ocpscjp-capitulo-8-inner-class","status":"publish","type":"post","link":"https:\/\/alejandroayala.solmedia.ec\/?p=1724","title":{"rendered":"Resumen OCP(SCJP): Cap\u00edtulo 8. Inner Class"},"content":{"rendered":"<h3>CLASES INTERNAS<\/h3>\n<p>Dentro de la clase externa se puede instanciar una clase interna as\u00ed:<\/p>\n<p>[java]<br \/>\nMyInner mi = new MyInner();<br \/>\n[\/java]<\/p>\n<p>Desde fuera de la clase externa se puede instanciar la clase interna as\u00ed:<\/p>\n<p>[java]<br \/>\nMyOuter mo = new MyOuter();<br \/>\nMyOuter.MyInner inner = mo.new MyInner();<br \/>\n\/\/o tambien<br \/>\nMyOuter.MyInner inner = new MyOuter().new MyInner();<br \/>\n[\/java]<\/p>\n<p>Ejemplo <em>Inner Class<\/em> tratando de acceder a una variable global externa, instancias y m\u00e1s.<\/p>\n<p>[java]<br \/>\nclass MyOuter {<br \/>\n   private String variableGlobalOuter = &quot;outter&quot;;<\/p>\n<p>   public void hacerInner() {<br \/>\n      MyInner mi = new MyInner();<br \/>\n      mi.seeInner();<br \/>\n   }<\/p>\n<p>   \/\/aqui si se permite clase private o final<br \/>\n   class MyInner {<\/p>\n<p>      void seeInner() {<br \/>\n         System.out.println(&quot;variableGlobalOuter: &quot; +variableGlobalOuter);<br \/>\n         System.out.println(&quot;Ref to Outer: &quot; + MyOuter.this);<br \/>\n         System.out.println(&quot;Ref to Inner: &quot;+this);<br \/>\n      }<br \/>\n   }<\/p>\n<p>   static class MyInnerEstatico {<br \/>\n       void verEstatico() {\/\/llamar a variableGlobalOuter no vale<br \/>\n       System.out.println(&quot;variableGlobalOuter: &quot;\/*+variableGlobalOuter*\/);<br \/>\n   }<br \/>\n}<\/p>\n<p>   public static void main(String[] args) {<br \/>\n      MyOuter o = new MyOuter();<br \/>\n      o.hacerInner();\t\t<\/p>\n<p>      \/\/instancia inner class<br \/>\n      MyInner i = new MyOuter().new MyInner();<\/p>\n<p>      \/\/instancia inner class static<br \/>\n      MyInnerEstatico mie = new MyOuter.MyInnerEstatico();<br \/>\n   }<br \/>\n}<br \/>\n[\/java]<\/p>\n<h3>CLASES INTERNAS EN M\u00c9TODOS LOCALES<\/h3>\n<ul>\n<li>Los \u00fanicos modificadores que pueden aplicar a una clase interna local son <em>abstract<\/em> o <em>final<\/em>.<\/li>\n<li>Una clase interna local que est\u00e1 definida dentro un m\u00e9todo, solamente puede ser instanciada dentro del m\u00e9todo donde dicha clase interna es creada.<\/li>\n<\/ul>\n<p>Ejemplo de una Clase Interna dentro de un Metodo Local, declaracion despu\u00e9s de la clase interna, acceso a la variable de metodo final y m\u00e1s.<\/p>\n<p>[java]<br \/>\npublic class MyOuter2 {<br \/>\n\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0 \/\/metodo que contiene una clase<br \/>\n\u00a0\u00a0\u00a0 \/\/Method-Local Inner Classes<br \/>\n\u00a0\u00a0\u00a0 public void metodoConClaseInterna() {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Cannot refer to a non-final variable.<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final String variableDeMetodo = &quot;variable de metodo local&quot;;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/only abstract or final is permitted, o default(sin modificador)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final class ClaseInternaDentroMetodo {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public void verInner() {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&quot;La variable variableDeMetodo &quot; +<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot;tiene que ser FINAL, si no es asi, &quot; +<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot;no compila (Cannot refer to a non-final&quot; +<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot; variable): &quot; +variableDeMetodo);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/la instancia de la clase interna en un metodo<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/debe ir despues de la clase inner NO antes<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ClaseInternaDentroMetodo ci = new ClaseInternaDentroMetodo();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ci.verInner();<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0 public static void main(String[] args) {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MyOuter2 o2 = new MyOuter2();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 o2.metodoConClaseInterna();<\/p>\n<p>\u00a0\u00a0\u00a0 }<br \/>\n}<br \/>\n[\/java]<\/p>\n<h3>CLASES INTERNAS AN\u00d3NIMAS<\/h3>\n<ul>\n<li>A causa del polimorfismo, los \u00fanicos m\u00e9todos que se pueden invocar de una clase interna an\u00f3nima son los m\u00e9todos pertenecientes al <em>supertipo<\/em> o <em>interface<\/em> que implementa.<\/li>\n<\/ul>\n<p>A continuaci\u00f3n un ejemplo:<\/p>\n<p>[java]<br \/>\npublic class OuterPopCorn {<\/p>\n<p>\u00a0\u00a0\u00a0 void metodoOuterPopCorn() {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&quot;Metodo de la clase externa OuterPopCorn&quot;);<br \/>\n\u00a0\u00a0\u00a0 }<\/p>\n<p>\u00a0\u00a0\u00a0 class InnerFood {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OuterPopCorn instanciaOuter = new OuterPopCorn() {<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 void metodoOuterPopCorn() {\/\/sobreescribiendo el metodo de la<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/clase externa OuterPopCorn<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&quot;ANONIMO!&quot;);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p>\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override no compila por la anotacion ya que el<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/este metodo no esta definido en la clase OuterPopCorn<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 void metodoNoDefinidoEnPopCorn() {\/\/genera warning<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&quot;Metodo que no existen en la&quot; +<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot;clase externa OuterPopCorn. Este metodo&quot; +<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot;no puede ser accedido.(Desde afuera)&quot;);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public void metodoInnerFood() {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 instanciaOuter.metodoOuterPopCorn();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/no compila is undefined for the type OuterPopCorn<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/instanciaOuter.metodoNoDefinidoEnPopCorn();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0 }<\/p>\n<p>\u00a0\u00a0\u00a0 public static void main(String[] args) {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 InnerFood instanciaInner = new OuterPopCorn().new InnerFood();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 instanciaInner.instanciaOuter.metodoOuterPopCorn();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 instanciaInner.metodoInnerFood();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/no compila is undefined for the type PopCorn<br \/>\n\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 instanciaInner.instanciaOuter.metodoNoDefinidoEnPopCorn();<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n}<br \/>\n[\/java]<\/p>\n<h3>CLASES ANIDADAS (CLASES INTERNAS EST\u00c1TICAS)<\/h3>\n<p>Como la clase anidada es est\u00e1tica, esta no comparte ninguna relaci\u00f3n con la instancia de la clase externa. De hecho, no se necesita una instancia de la clase externa para instanciar una clase anidada<\/p>\n<p>Una clase anidada no puede acceder a los miembros no est\u00e1ticos de la clase externa, ya que no posee una referencia impl\u00edcita a ella.<\/p>\n<h4>EOF<\/h4>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=a1ejo_ayala\" class=\"twitter-share-button\" data-size=\"large\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>CLASES INTERNAS Dentro de la clase externa se puede instanciar una clase interna as\u00ed: [java] MyInner mi = new MyInner(); [\/java] Desde fuera de la clase externa se puede instanciar la clase interna as\u00ed: [java] MyOuter mo = new MyOuter(); MyOuter.MyInner inner = mo.new MyInner(); \/\/o tambien MyOuter.MyInner inner = new MyOuter().new MyInner(); [\/java] Ejemplo\u2026 <span class=\"read-more\"><a href=\"https:\/\/alejandroayala.solmedia.ec\/?p=1724\">Leer m\u00e1s &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":690,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[4],"tags":[447,506,446,326],"_links":{"self":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1724"}],"collection":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1724"}],"version-history":[{"count":5,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions"}],"predecessor-version":[{"id":1729,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions\/1729"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/media\/690"}],"wp:attachment":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1724"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1724"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}