Clases internas de Java
1. Significado
En el lenguaje de programación Java, los programas se crean a partir de clases. Las clases también se pueden declarar dentro de una clase, y llamamos a una clase interna de este tipo de clase.
2. Función
• Implementación de una mejor encapsulación, sabemos que los modificadores de acceso para clases ordinarias (clases no internos) no pueden ser privadas o protegidas, mientras que las clases internas pueden. Cuando declaramos la clase interna como privada, solo la clase exterior puede acceder a la clase interior, ocultando muy bien la clase interior.
• Las clases internas pueden heredar (extender) o implementar (implementar) otras clases o interfaces sin verse afectadas por clases externas.
• Las clases internas pueden acceder directamente a campos y métodos de clases externas, incluso si se modifican con privado. Por el contrario, las clases externas no pueden acceder directamente a los miembros de las clases internas.
3. Principio
Las clases internas son un concepto de tiempo de compilación. Después de la compilación, se generarán dos archivos de clase independientes, de la siguiente manera:
public class Outer {private string ouertame = "outter"; clase Inner {private String innerName = "Inner"; }}El archivo compilado es el siguiente:
Después de la compilación, OUTER.inner se renombra a los $ internos externos, y el período (.) Se reemplaza con el signo de dólar ($).
IV. Clasificación
Las clases internas de Java se pueden dividir en clases internas de miembros, clases internas locales, clases internas anónimas y clases internas estáticas.
1) Clase interna de miembros
Una clase interna miembro puede considerarse como miembro de una clase externa. Un miembro estático no puede ser declarado en una clase interna de miembro, pero el campo final estático es una excepción. Sabemos que cuando se carga una clase, los miembros estáticos se inicializarán primero. Si la clase interna del miembro tiene miembros estáticos, la clase interna se generará antes de la clase externa. La clase interna sirve a la clase externa, y la clase interna generada antes de la clase externa puede estar fuera de control. Al instancias de una clase interna miembro, la clase interna miembro mantendrá una referencia al objeto actual de la clase externa, de modo que se pueda acceder directamente a los miembros de la clase externa en la clase interna del miembro, incluso si el privado se modifica.
importar java.lang.system.out; public class Outer {private string ouertame = "outter"; // La clase externa no puede acceder directamente a los miembros de la clase interna y necesita instanciar el objeto de clase interna privada interna interna = new Inner (); clase pública Inner {private String InnerName = "Inner"; public void show () {out.println (ourtername); // Puede acceder directamente a los miembros de la clase exterior}} public void show () {out.println (inner.innerName); inner.show (); } public static void main (string [] args) {externo externo = new Outer (); externo.show (); // instanciar la clase interna externa.inner inner = outer.new inner (); inner.show (); }}Resultados de ejecución:
interno
exterior
exterior
La referencia al objeto de clase externa de la clase interna del miembro se compone del nombre de la clase externa antes de esto. Esta forma se llama
Limited-this, out.println (ourtername) y out.println (externo.this.outername) son equivalentes.
2) Clases internas locales
El uso de clases internas locales es básicamente el mismo que el de las clases internas miembros. Es solo que las clases internas locales se definen en los métodos de la clase externa, al igual que las variables locales, y no son miembros de la clase externa. Una clase interna local es inaccesible fuera del método, pero sus instancias se pueden devolver del método y las instancias permanecerán hasta que ya no sean referenciadas. Las clases internas locales también pueden acceder a variables locales, parámetros del método, etc. del método que se encuentran. La limitación es que las variables locales o los parámetros del método solo se pueden acceder cuando se declara como final.
importar java.lang.system.out; public class Outer {private string ouertame = "outter"; Public void show (final de cadena Str) {// Los parámetros del método son la clase de tipo final interno {public void print () {out.println (ouertame+str); }} Inner Inner = new Inner (); inner.print (); } public static void main (string [] args) {externo externo = new Outer (); externo.show (": lalala"); }}Resultados de ejecución:
Exterior: Lalala
3) clase interna anónima
Puede imaginar clases internas anónimas como clases internas locales sin nombres de clase. Las clases internas anónimas tienen las siguientes características:
1. Las clases internas anónimas no pueden tener constructores. Las clases internas anónimas no tienen nombres de clase, por lo que el constructor no puede ser declarado.
2. Las clases internas anónimas deben heredar o implementar una interfaz. El tipo asignado a nuevo es el supertipo de la clase anónima. Las clases anónimas no pueden tener extendidas o implementos que se muestren las cláusulas, ni pueden tener ningún modificador.
3. Las clases internas anónimas son las mismas que las clases internas de los miembros y las clases internas locales, y los miembros estáticos no pueden ser declarados.
importar java.lang.system.out; public class Outer {private string ouertame = "outter"; public void show (final string str) {new Inner () {// Implementar la interfaz interna public void print () {out.println (ouertame+str); } }.imprimir(); } public static void main (string [] args) {externo externo = new Outer (); externo.show (": lalala"); }} interfaz interna {void print (); }Resultados de ejecución:
Exterior: Lalala
4) clase interna estática
La clase interna estática, también llamada clases anidadas en algunos libros, requiere el uso de modificadores estáticos al declararlo. La clase interna estática es diferente de las primeras tres clases internas. La clase interna estática no tiene referencias al objeto actual de la clase externa, por lo que no se puede acceder a los miembros no estáticos de la clase externa en la clase interna estática. Se puede decir que la clase interna estática no depende de la clase externa.
importar java.lang.system.out; public class Outer {private string ouertame = "outter"; ID de estática privada int = 123; Private Inner Inner = new Inner (); public static class interner {public void print1 () {//out.println(ooUtername); No se puede acceder a un miembro no estático de la clase externa. Println (id); } public static void print2 () {out.println (id); }} public void show () {inner.print1 (); } public static void main (string [] args) {externo externo = new Outer (); externo.show (); Externo.inner.print2 (); // Acceda a la clase interna estática a través del nombre de la clase}}