Clase interna de Java
1. ¿Qué es una categoría interna?
La definición de una clase se coloca dentro de otra clase, y esta clase se llama clase interna
2. ¿Cuáles son las características de las clases internas?
1. La clase interna sigue siendo una clase independiente. Después de la compilación, la clase interna se compilará en un archivo .class independiente, pero está precedido por el nombre de la clase y el símbolo $ de la clase externa.
2. No se puede acceder a clases internas de manera ordinaria. La clase interna es miembro de la clase externa, por lo que la clase interna puede acceder libremente a las variables miembros de la clase externa, ya sea privada o no.
3. Si la clase interna se declara como estática, no puede acceder a las variables miembros de la clase externa a voluntad. En este momento, la clase interna solo puede acceder a las variables de miembros estáticos de la clase externa.
3. ¿Cuáles son las categorías internas?
1. Clase interna del miembro
como:
paquete com.test01; clase pública A {// La clase B interna B Hereda TestPojo e implementa la interfaz TestInterface La clase B extiende TestPojo implementos TestInterface {// Método interno B de clase B public Void run () {System.out.println ("Estoy en ejecución!"); } // Reescribe el método de interfaz public void testf () {System.out.println ("Implementa la interfaz!"); }} // llame a la clase interna public void test () {b b = new b (); B.Testf (); // Use el método de la interfaz de reescritura B.Run (); // llame a su propio método b.testpojo (); // Método de llamada heredando la clase principal} // Método principal Prueba public static void main (string [] args) {a a = new a (); a.test (); }} // Definir una interfaz, el método es testf () interface testInterface {public void testf ();} // Define un método de clase normal testpojo () class testpojo {public void testpojo () {System.out.println ("Soy una clase simple de pojo"); }} // Implementar para llamar a los métodos en la clase interna Textone {public static void main (string [] args) {ab b = new a (). New B (); // Llamar a la clase B interna en la clase A /** es equivalente al siguiente código* a a = nuevo a (); * AB B = A.New B (); * */ b.testf (); // Use el método de la interfaz de reescritura B.Run (); // llamando a su propio método b.testpojo (); // llamando al método que hereda la clase principal}}2. Método de clase interna
paquete com.test01; public class pertest {public void test () {// Definir una clase de método NE {// Definir un método Clase interna pública Void Fle () {// Defina un método de clase interna System.out.println ("¡Volando!"); }}; nuevo ne (). Fle (); // llamando al método de la clase interna} public static void main (string [] args) {new Pertest (). Test (); //Prueba}} Nota: (1) La clase interna del método solo se puede instanciar dentro del método que define la clase interna, y no puede instanciarse fuera de este método.
(2) El objeto de clase interna del método no puede usar variables locales no final del método donde se encuentra la clase interna.
Debido a que las variables locales del método están en la pila, solo existen durante la vida del método. Cuando termina un método, se elimina su estructura de pila.
Las variables locales se convierten en historia. Sin embargo, después de finalizar el método, ¡los objetos de clase internos creados dentro del método aún pueden existir en el montón!
Por ejemplo, si se pasa una referencia a algún otro código y se almacena en una variable miembro. Debido a que no se puede garantizar que las variables locales tengan la misma vida larga que las de los objetos de clase interna del método, los objetos de clase interna no pueden usarlos. (Esta comprensión proviene de la enciclopedia de Baidu)
3. Clase interna anónima
1) Clases internas anónimas abstractas
paquete com.anonymous; public class abstractClass {public void test () {// El método es Test testa a = new testa () {// implementar clase abstract @override public void run () {// implementar la clase abstract.Println ("Estoy usando la clase interna anónima abstracta"); }}; a.run (); // llamando al método de la clase interna} public static void main (string [] args) {new AbstractClass (). Test (); // test}} // Definir una clase abstracta El método abstracto de testa es run () abstracto clase testa {public abstract void run ();}2) Interfaz Clase interna anónima
paquete com.anonymous; public class testanonymous {myInterface m = new MyInterface () {// Implementar la interfaz public void eat () {// Reescribe el método de interfaz myInterface System.out.println ("¡Estoy tomando una comida!"); }}; public void ss () {// método ss m.eat (); // llame al método sobrescrito} public static void main (string [] args) {new testAnonymous (). Ss (); // test}} // Definir un método de interfaz como EatInterface MyInterface {public void eat ();}Nota: Las clases internas anónimas se pueden definir dentro de los métodos o en los miembros de la clase. No importa qué clases internas anónimas sean, no pueden llamarse directamente por clases externas.
4. ¿Cuál es el papel de las categorías internas?
Cada clase interna puede heredar de forma independiente de una implementación (interfaz), por lo que si la clase periférica ha heredado una determinada implementación (interfaz) no tiene ningún efecto en la clase interna. Sin la capacidad proporcionada por las clases internas para heredar múltiples clases concretas o abstractas, algunos problemas de diseño y programación son difíciles de resolver. Desde esta perspectiva, las clases internas hacen que la solución de herencia múltiple se complete.
Las interfaces resuelven algunos problemas, mientras que las clases internas implementan efectivamente "herencia múltiple".
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!