Java Inner Clase, un concepto similar también se encuentra en C ++, es decir, clase anidada. A primera vista, las clases internas pueden parecer un poco redundantes, y su utilidad puede no ser tan significativa para los principiantes, pero con una comprensión profunda de ello, encontrará que los diseñadores de Java están realmente bien intencionados en las clases internas. Aprender a usar clases internas es parte de dominar la programación avanzada de Java, que le permite diseñar su estructura de programa con más elegancia. Los siguientes se introducen a partir de los siguientes aspectos:
Primera reunión
Contenido de la interfaz pública {int value ();} Public Interface Destination {String readLabel ();} Public Class Goods {private Clase Content implementa contenido {private int i = 11; public int value () {return i; }} La clase protegida GDestination implementa destino {etiqueta de cadena privada; GDestination privado (String Whereto) {Label = WhereTo; } public String readLabel () {etiqueta de retorno; }} Public Destination Dest (String s) {return new GDestination (s); } contenido público contenido () {return nuevo content (); }} class testGoods {public static void main (string [] args) {bienes p = new Goods (); Contenido c = P.cont (); Destino d = p.dest ("beijing"); }}En este ejemplo, el contenido de las clases y la GDestinación se definen dentro de los bienes de clase y tienen modificadores protegidos y privados respectivamente para controlar el nivel de acceso. El contenido representa el contenido de los bienes, mientras que GDestination representa el destino de los bienes. Implementan dos interfaces de contenido y destino, respectivamente. En el método principal a continuación, use el contenido C y el destino D directamente para operar, ¡y ni siquiera ve los nombres de estas dos clases internas! De esta manera, se refleja el primer beneficio de las clases internas: ocultar las operaciones que no desea que otros sepan, es decir, encapsulación.
Al mismo tiempo, también descubrimos el primer método para obtener objetos de clase interna fuera del alcance de la clase externa, es decir, para usar los métodos de su clase externa para crear y regresar. Así es como lo hacen los métodos cont () y des () en el ejemplo anterior. Entonces, ¿hay alguna otra forma? Por supuesto, el formato de sintaxis es el siguiente:
OuterObject = new OuterClass (parámetros del constructor); OuterClass.innerClass innerObject = OuterObject.Nnew innerClass (parámetros constructores);
Tenga en cuenta que al crear objetos de clase interna no estatales, primero debe crear los objetos de clase externa correspondientes. En cuanto a la razón, también conduce a nuestro próximo tema:
Los objetos de clase interna no estatales tienen referencias a sus objetos de clase exterior
Un poco de modificación al ejemplo justo ahora:
Bienes de clase pública {valor privado = 2; El contenido de la clase privada implementa contenido {private int i = 11*valorado; public int value () {return i; }} La clase protegida GDestination implementa destino {etiqueta de cadena privada; GDestination privado (String Whereto) {Label = WhereTo; } public String readLabel () {etiqueta de retorno; }} Public Destination Dest (String s) {return new GDestination (s); } contenido público contenido () {return nuevo content (); }}La parte modificada se muestra en rojo. Aquí agregamos una variable de miembro privado valorado a la clase de bienes, lo que significa el coeficiente de valor de los bienes. Multiplica cuando el valor del método de contenido de clase interna () calcula el valor. Descubrimos que Value () puede acceder a Valueer, que también es el segundo beneficio de las clases internas: ¡un objeto de clase interna puede acceder al contenido del objeto de clase externa que lo creó, incluso incluyendo variables privadas! Esta es una característica muy útil que nos proporciona más ideas y atajos al diseñar. Para implementar esta función, el objeto de clase interna debe tener una referencia al objeto de clase exterior. Cuando el compilador Java crea un objeto de clase interna, pasa implícitamente la referencia a su objeto de clase externa y lo guarda todo el tiempo. Esto permite que los objetos de clase interno siempre accedan a sus objetos de clase externa, lo cual también es por qué fuera del alcance de las acciones de clase externas, el objeto de clase externa debe crearse primero.
Algunas personas pueden preguntar, ¿qué pasa si una variable miembro en una clase interna es la misma que una variable miembro en una clase externa, es decir, una variable miembro del mismo nombre en la clase exterior está bloqueada? Está bien, Java usa el siguiente formato para expresar referencias a clases externas:
externa
Con él, no tenemos miedo de tales situaciones de bloqueo.
Clase interior estática
Al igual que las clases ordinarias, las clases internas también pueden ser estáticas. Sin embargo, en comparación con las clases internas no estáticas, la diferencia es que las clases internas estáticas no tienen referencias al exterior. Esto en realidad es muy similar a las clases anidadas en C ++. La mayor diferencia entre las clases internas de Java y las clases anidadas de C ++ es si hay referencias al exterior. Por supuesto, hay una diferencia con la perspectiva del diseño y algunos detalles del mismo.
Además, en cualquier clase interna no estática, no puede haber datos estáticos, métodos estáticos u otra clase interna estática (la clase interna puede anidarse más de una capa). Sin embargo, las clases internas estáticas pueden tener todo esto. Esta es también la segunda diferencia entre los dos.
Clases internas locales
Sí, las clases internas de Java también pueden ser locales, y pueden definirse dentro de un método o incluso un bloque de código.
Public Class Goods1 {Public Destination Dest (String S) {clase GDestination implementa destino {etiqueta de cadena privada; GDestination privado (String Whereto) {Label = WhereTo; } public String readLabel () {etiqueta de retorno; }} return New GDestination (s); } public static void main (string [] args) {gots1 g = new Goods1 (); Destino d = g.dest ("beijing"); }}Este es un ejemplo anterior. En el método Dest definimos una clase interna, y finalmente este método devuelve el objeto de esta clase interna. Esto se puede hacer si solo necesitamos crear uno de sus objetos y crearlo en el exterior cuando use una clase interna. Por supuesto, las clases internas definidas en los métodos pueden diversificar los diseños, y el propósito no es solo en este sentido.
Aquí hay un ejemplo más extraño:
Public Class Goods2 {private void internalTracking (boolean b) {if (b) {class TrackingsLip {private String id; Rackingslip (string s) {id = s; } Cadena getSlip () {return id; }} Backingslip ts = new TrackingsLip ("Slip"); Cadena s = ts.getslip (); }} public void Track () {internalTracking (true); } public static void main (string [] args) {gots2 g = new Goods2 (); g.track (); }}No puede crear un objeto de esta clase interna fuera de IF, porque esto está más allá de su alcance. Sin embargo, al compilarse, la línea de seguimiento de la clase interna se compila al mismo tiempo que otras clases, pero no es válido si excede este alcance debido a su propio alcance. Aparte de esto, no es diferente de otras clases internas.
Clase interna anónima
Las reglas de sintaxis de las clases internas anónimas de Java se ven un poco extrañas, pero al igual que las matrices anónimas, cuando solo necesita crear un objeto de una clase y no puede usar su nombre, usar una clase interna puede hacer que el código se vea conciso y claro. Sus reglas de sintaxis son las siguientes:
nuevo interfacename () {......}; o nuevo SuperClassName () {......};Sigamos dando un ejemplo:
Public Class Goods3 {contenido público contenido () {return nuevo contenido () {private int i = 11; public int value () {return i; }}; }}Aquí, el método cont () usa una clase interna anónima para devolver directamente un objeto que implementa la clase del contenido de la interfaz, que parece muy conciso.
En el adaptador anónimo para el procesamiento de eventos en Java, las clases internas anónimas se usan ampliamente. Por ejemplo, cuando desee cerrar la ventana, agregue este código:
Frame.Addwindowlistener (New WindowAdapter () {public void WindowClosing (WindowsEvent E) {System.exit (0);}});Una cosa a tener en cuenta es que, dado que la clase interna anónima no tiene nombre, no tiene un constructor (pero si esta clase interna anónima hereda una clase principal que solo contiene un constructor con argumentos, debe traer estos parámetros al crearlo y usar la palabra súper clave para llamar al contenido correspondiente durante el proceso de implementación). Si desea inicializar sus variables de miembro, hay varias maneras:
Si se trata de una clase interna anónima de un método, puede usar este método para pasar los parámetros que desea, pero recuerde que estos parámetros deben declararse finales.
Reforme la clase interna anónima en una clase interna local nombrada para que pueda tener un constructor.
Use bloques de código de inicialización en esta clase interna anónima.
¿Por qué necesitan clases internas?
¿Cuáles son los beneficios de las clases internas de Java? ¿Por qué necesitan clases internas?
Primero, damos un ejemplo simple. Si desea implementar una interfaz, pero un método en esta interfaz tiene el mismo nombre y parámetros que un método en la clase que imaginó, ¿qué debe hacer? En este momento, puede crear una clase interna para implementar esta interfaz. Dado que la clase interna es accesible para todos los contenidos de la clase exterior, hacerlo puede lograr todas las funciones que implementa directamente esta interfaz.
Pero es posible que tenga que cuestionar, ¿no es suficiente para cambiar el método?
De hecho, es realmente poco convincente usar esto como una razón para diseñar categorías internas.
La verdadera razón es que las clases e interfaces internas en Java se combinan para resolver un problema del que los programadores de C ++ a menudo se quejan: no hay más herencia. De hecho, la multi-herencia de C ++ es muy complicada de diseñar, y Java puede lograr el efecto de la herencia múltiple a través de clases e interfaces internas.
Resumen de clase interna de Java
(1) clase interna no estática definida entre métodos:
● Las clases periféricas e internas pueden acceder a sus propios miembros privados entre sí.
● Las variables de miembros estáticos no se pueden definir en la clase interna.
Fuera del alcance de la clase externa, para crear un objeto de clase interna, primero debe crear su objeto de clase externa
(2) Clase interna estática definida entre métodos:
● Solo se puede acceder a miembros estáticos de clases externas.
La clase interna estática no tiene referencias al exterior
(3) clase interna local definida en el método:
● Esta clase interna no tiene permisos de control de acceso
● La clase periférica no puede ver la clase interna local en el método, pero la clase interna local puede acceder a cualquier miembro de la clase periférica.
● Se puede acceder a clases internas locales en el cuerpo del método, pero la declaración de acceso debe ser después de definir las clases internas locales.
● Las clases internas locales solo pueden acceder a constantes en el cuerpo del método, es decir, los miembros modificados con final.
(4) clase interna anónima definida en el método:
● No hay constructor, sino que pasa los parámetros del constructor al constructor de superclase
Cuando solo necesita crear un objeto de clase y no usar su nombre, usar clases internas anónimas puede hacer que el código se vea conciso y claro.
El artículo anterior comprende de manera completa las clases internas y anónimas en Java es todo el contenido que he compartido con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.