Concepto de clase interna de Android y Java

I seguido el enlace http://developer.android.com/reference/android/app/AlertDialog.html e intento crear nuevo AlertDialog como este

AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create(); 

Como por el documento AlerDialog es la clase externa y Builder es la clase interna dentro de AlertDialog. Ahora he vinculado el mismo concepto con java en el acceso a la clase interna como este Outer myOuter2 = new Outer.Inner(); Esta pieza de da error cuando intento acceder, aquí está el código java completo

 package com.test; public class Outer { public void OuterMethod() { System.out.println("OuterMethod"); } public static void main(String[] args) { Outer myOuter = new Outer(); myOuter.OuterMethod(); Outer myOuter2 = new Outer.Inner();//this piece of code gives error } class Inner { Inner() { System.out.println("constructor Inner"); } public void InnerMethod() { System.out.println("Inside InnerMethod"); } } } 

Así que mi pregunta aquí es cómo entender el mismo concepto de clase interna en android y acceder a los métodos dentro de ese

Ha creado una clase interna no estática (una clase de instancia interna), mientras que AlertDialog.Builder es una clase estática.

Para conseguir que su código funcione como es usted necesita una manera interesante de invocar new que va como esto:

 Outer.Inner myOuter2 = myOuter.new Inner(); 

Esto se debe a que actúa como cualquier otro campo no estático en el exterior – que requiere una instancia de exterior para ser válido. En cualquier caso, esto no suele ser una buena idea ya que las clases públicas no estáticas son raras.

Lo más probable es que Inner sea ​​una clase estática, es decir, una declarada como:

 static class Inner { 

Esencialmente esto desacopla a Inner de su clase contenedora, simplemente pasa a vivir dentro de ella y así puede ser instanciada a través de new Outer.Inner() . Podría vivir felizmente como una clase pública por derecho propio en un nuevo archivo .java en su lugar.

Las clases estáticas internas son útiles cuando la clase interna se utiliza solamente en relación con la clase externa, por lo que muestra la relación entre ellas.

En el caso de Android, se utiliza un AlertDialog.Builder sólo cuando se AlertDialog un AlertDialog . Si se tratara de un Builder general utilizado por otras clases (por ejemplo, un cuadro de Dialog normal) se habría declarado como su propia clase pública (es decir, una clase independiente que no está anidada dentro de otra).

No hay relación entre Outer e Inner excepto que comparten un archivo de clase. Por lo tanto, no puede escribir:

 Outer myOuter2 = new Outer.Inner(); 

Tal vez usted quiso decir:

 Outer.Inner myInner = new Outer.Inner(); 

La clase Inner tendrá que ser declarada como static para que esto funcione.


Tenga en cuenta que un constructor normal devolverá un tipo que es igual al tipo de inclusión. He aquí un pequeño ejemplo usando nombres de clase similares a su código:

 public class Outer { public static void main(String[] args) { Outer outer = new Outer.Builder().withParam("foo").build(); } private final String someParam; private Outer(String someParam) { this.someParam = someParam; } public static class Builder { private String someParam; public Builder() { } public Builder withParam(String value) { this.someParam = value; return this; } public Outer build() { return new Outer(someParam); } } } 

También puede leer el ítem # 2 de Effective Java de Joshua Bloch , 2nd Edition para una buena descripción del diseño y la justificación del constructor. Disponible en línea: aquí .

La clase AlertDialog.Builder es una clase interna estática como se puede ver aquí .

 public static class Builder {...} 

Finalmente me di cuenta aquí es el código

 package com.test; public class Outer { public void OuterMethod() { System.out.println("OuterMethod"); } public static void main(String[] args) { Outer myOuter = new Outer(); myOuter.OuterMethod(); Outer myOuter2 = new Outer.Inner().InnerMethod(); } static class Inner { Inner() { System.out.println("constructor Inner"); } public Outer InnerMethod() { Outer myOuter = new Outer(); System.out.println("Inside InnerMethod"); return myOuter; } } } 
  • Mensaje firmado usando OpenSSL; No se puede verificar con Android Java
  • RippleDrawable - Mostrar efecto de rizado por programación
  • Actividad se ha filtrado ventana - Android
  • Cómo borrar la animación en android?
  • Convertir el número en textview en int
  • Android: Notificaciones push de GCM que no aparecen en la lista de notificaciones
  • Android | Obtener la versión de la biblioteca OkHTTP en tiempo de ejecución
  • No se pueden obtener widgets de main.xml referenciados en el programa Java
  • AsyncTask.executeOnExecutor () antes de API Nivel 11
  • Copia el directorio de los activos a la carpeta de datos
  • Maven se niega a descargar una dependencia empacada desde un repositorio remoto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.