Camino de aprendizaje de Java: 28 clases internas (miembros, locales, anónimos, estática) y la herencia

Aquí Insertar imagen Descripción


如果在类中再定义一个类,则将在类中再定义的那个类称为内部类。

A. Los miembros de la clase interna

1. Los miembros de la presentación clase interna

Las clases internas en una clase, lo puede conseguir en unas variables miembro privadas directamente dentro de la clase de la clase.
Los miembros de la clase interna sintaxis es la siguiente:

public class OuterClass{  // 外部类
    private class lnnerClass{  // 内部类
    // .......
    }
}

在内部类中可以随意使用外部类的成员方法以及成员变量。尽管这些类成员被修饰为private。

内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就好绑定在外部类对象上。内部类初始化方法与其他类初始化方法相同,都是使用new关键字。

public class OuterClass {
    innerClass in = new innerClass();  // 在外部类实例化内部类对象引用
    public void ouf() {
        in.inf();  // 在外部类方法中调用内部类方法
    }
    class innerClass {
        innerClass(){  // 内部类构造方法
    }
    public void inf() { // 内部类成员方法
    }
    int y = 0;   //定义内部类成员变量
    }
    public innerClass doit() { // 外部类方法,返回值为内部类引用
        //y = 4;    // 外部类不可以直接访问内部类成员变量
        in.y = 4; 
        return new innerClass(); // 返回内部类的引用
    }
    public static void main(String[] args) {
        OuterClass out = new OuterClass(); 
        // 内部类的对象实例化操作必须在外部类或外部类的非静态方法中实现
        OuterClass.innerClass in = out.doit(); 
        OuterClass.innerClass in2 = out.new innerClass(); 
        // 实例化一个内部类对象
    }
}

在实例化内部类对象时,不能在new操作符之前使用外部类名称实例化内部类对象,而是应该使用外部类的对象来创建其内部类的对象。

内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。


2. upcast clase de interfaz interna

Si un modificador interna privada basado en el permiso es objeto de la clase padre conversión hacia arriba, o es una interfaz de transición ascendente directa dentro de un programa puede estar completamente oculta dentro de la clase de implementación específica. Puede proporcionar una interfaz externa, un método declarado en la interfaz. Si los métodos de interfaz implementadas dentro de la clase que implementa la interfaz, se puede definir una pluralidad de implementos de clase internas el mismo método de interfaz de una manera diferente, de la misma clase general no es un método para lograr interfaz múltiple . esta técnica se utiliza a menudo en la programación de swing, se puede hacer un número de diferentes eventos en respuesta a una clase.

interface OutInterface{ // 定义一个接口
    public void fun(); 
}
public class InterfaceInner {
    public static void main(String[] args) {
        OuterClass2 out = new OuterClass2(); // 实例化一个OuterClass22对象
        // 调用doit()方法,返回一个OutInterface接口
        OutInterface outinter = out.doit(); 
        outinter.fun(); // 调用fun()方法
    }
}
class OuterClass2{
 // 定义一个内部类实现OutInterface接口
    private class InnerClass implements OutInterface{
        InnerClass(String s){ // 内部类构造方法
            System.out.println(s); 
        }
        public void fun() { // 实现接口中的fun()方法
            System.out.println("访问内部类中的fun()方法"); 
        }
    }
    public OutInterface doit() { // 定义一个方法,返回值类型为OutInterface接口
        return new InnerClass("访问内部类构造方法"); 
    }
}

Resultados de ejecución:
Aquí Insertar imagen Descripción
clase OuterClass2 define una clase interna se modifica la autorización para la clase privada, interna que implementa la interfaz OutInterface, a continuación, modifique el método de manera que el método devuelve una interfaz OutInterface doit (). Dado que los InnerClass clase derechos de modificación internas a privada, lo que además de OuterClass2 de acceso de clase lata fuera de la clase interna, otras clases pueden tener acceso a, y el acceso a () método doit. Dado que este método devuelve el tipo de una interfaz externa, esta interfaz puede servir como una interfaz para uso externo. Incluye un método diversión (), este método implementa este hereda de interfaz de clase interna, si un hereda de la clase la clase externa, debido a la autoridad interna no abatido clase interna InnerClass, pero también no puede acceder a la diversión ( ) método método de la interfaz divertido, pero se puede acceder a (). Por lo que se hereda de la clase cueros subclase los detalles de implementación, acaba de escribir una subclase de personas que salen de una interfaz y una clase externa, pero también pueden llamar al método de diversión (), pero la diversión proceso de aplicación específica () método tiene está bien escondido, y esto es el uso más básico de las clases internas.

非内部类不能被声明为private或protected访问类型。


3. Utilice esta clase para obtener una referencia dentro y fuera de la clase de palabras clave

Si las variables miembro variable miembro define en una clase externa y clases internas del mismo nombre, puede utilizar esta palabra clave.

public class TheSameName{
    private int x; 
    private class Inner{
        private int x = 9; 
        public void doit(int x) {
            x++;  // 调用的是形参x
            this.x++; //调用内部类的变量x
            TheSameName.this.x++; //调用外部类的变量x
        }
    }
}

在类中,如果遇到内部类与外部类的成员变量重名的情况,可以使用this关键字进行处理。


II. Clases internas parciales

No sólo en la clase interna puede ser definido en la clase, la posición puede definirse en la clase local se puede definir como un método de clase clase interna, o cualquier ámbito de aplicación.

interface OutInterface2{// 定义一个接口
}
class OuterClass3{
    public OutInterface2 doit(final String x){
    	// 在doit()方法中定义一个内部类
    	    class InnerClass2 implements OutInterface2{
    	        InnerClass2(String s){
    	            s = x; 
    	            System.out.println(s);
    	        }
    	    }
    	    return new InnerClass2("doit");
    }
}

III. Anonymous clases internas

class OuterClass4{
    public OutInterface2 doit(){
        return new OutInterface2(){// 声明匿名内部类
            private int i = 0; 
            public int getValue(){
                return i; 
            }
        };
    }
}

在匿名内部类定义结束后,需要加分号标识,这个分号并不是代表定义内部类结束的标识,而是代表创建OutInterface2引用表达式的标识。
匿名内部类编译以后,会产生以“外部类$序号”为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类。


IV. Estático clases internas

Antes de añadir un modificador de clases internas estáticas, esta clase interna se convierte en una clases internas estáticas. A las clases internas estáticas pueden declarar miembros estáticos, pero no pueden declarar miembros estáticos en una clase no estática interiores. clases internas estáticas tienen una característica máxima es miembro no estática no se pueden utilizar fuera de la clase.

public class StaticinnerClass{
    static class Inner{
    // .........
    }
}

clase interna Inheritance V.

Las clases internas y otra categoría general, como pueden ser heredados, pero la analogía interna heredada heredan clase común de complejos, necesidad de establecer una sintaxis especial para completar.

public class OutputInnerClass extends ClassA.ClassB{
    public OutputInnerClass(Class a){
        a.super();
    }
}
class CLassA{
    class ClassB{
    }
}

在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继续内部类的外部类的引用,同时在构造方法体中使用a.super()语句,这样才能为继承提供必要的对象引用。


Si mal, por favor me la crítica correcta, los comentarios son bienvenidos.
Cada frase de texto: Por favor, tenga la seguridad de que alguien en este mundo realmente vivir la vida que desea. Por favor, comprenda también que el Congreso tenía contratiempos abstengo usted no ha experimentado.

Publicado 74 artículos originales · ganado elogios 180 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/Fdog_/article/details/104747386
Recomendado
Clasificación