2012-06-14 10 views
6

¿Qué significa declarar una clase interna no estática como final?¿Cuáles son las clases internas finales?

He intentado muchos enlaces en google y stackoverflow.com también, pero todos ellos parecen estar tratando sobre clases internas que acceden a miembros finales no clases internas finales. Encontré this enlace en google pero incluso no lo explica.

¡Gracias por adelantado!

+0

Consulte aquí http://en.wikipedia.org/wiki/Final_%28Java%29#Final_classes – user845279

+2

¿Por qué esperaría que significara algo diferente de hacer una final de clase de nivel superior? –

+0

bien porque la clase interna es una clase pero también es un miembro de la clase externa. Entonces, ¿sería no heredable o habrá algún otro comportamiento debido a la final? –

Respuesta

0

Tiene la misma semántica que una clase externa que se declara definitiva: la clase no se puede extender.

Considere este ejemplo:

public class MyClass { 
    public class A { 
    } 
    public class B extends A { 
    } 
} 

Si se agrega el modificador final a un generará un error de compilación.

+0

thnx! también ¿cómo extendería una clase interna no final desde fuera de la clase externa? 'TestClass extiende MyOuter.MyInner' ?? –

+0

TestClass necesitaría un constructor que tome MyOuter. Luego llamas al súper método de MyOuter. –

+0

@SurenderThakran Creo que eso solo es posible si la clase interna que intentas extender es estática. Ver esto [matriz de herencia] (http://mindprod.com/jgloss/nestedclasses.html#INHERITANCE) – user845279

5

No hay diferencia semántica entre hacer una clase de nivel superior final y crear una clase interna final: le dice al compilador que no puede heredar de la clase. Las clases de marcado final a veces se hacen para permitir que el compilador saltee una búsqueda de tabla virtual, pero esto a menudo se considera una micro-optimización prematura.

0

Bueno, las clases internas no son de ninguna manera diferentes de las clases externas en ese contexto. Entonces el siguiente código es perfectamente válido.

class Outer { 
int some_member; 

class Inner { 
void method(); 
} 
} 

class OuterExtendsInner extends Outer.Inner{ 

} 

Como todos sabemos, los fines de declarar una clase final es que evitamos cualquier intruso fuera de la subclasificación de la clase y la explotación de sus instalaciones, de la misma manera que podemos hacer en el caso de las clases internas.

Cuestiones relacionadas