Malditas clases internas

Iniciado por 4dr14n31t0r, 19 Enero 2016, 12:13 PM

0 Miembros y 1 Visitante están viendo este tema.

4dr14n31t0r

Tengo el siguiente codigo:
class ClaseExterna{
class ClaseInternaNoEstatica{}
static class ClaseInternaEstatica{}
}

Para crear un objeto de la ClaseExterna hago lo siguiente:ClaseExterna obj = new ClaseExterna();
Despues si quiero crear un objeto de la ClaseInternaNoEstatica hago lo siguiente:ClaseExterna.ClaseInternaNoEstatica obj2 = obj.new ClaseInternaNoEstatica();
Consecuentemente tambien puedo crear un objeto de la ClaseInternaNoEstatica de la siguiente forma:ClaseExterna.ClaseInternaNoEstatica obj2 = new ClaseExterna().new ClaseInternaNoEstatica();
Ahora bien, si la clase interna es estatica, y al ser interna se considera un miembro del mismo al igual que sus atributos y métodos, entonces no debería de haber problema si creo un objeto de esa clase interna de la siguiente forma:ClaseExterna.ClaseInternaEstatica obj = ClaseExterna.new ClaseInterna();//Error de compilación
Sin embargo da error. ¿Por qué? ¿Por qué para crear un objeto debe ser, sin embargo, de la siguiente forma?ClaseExterna.ClaseInternaEstatica obj = new ClaseExterna.ClaseInternaEstatica();

Otra duda: cuando implemento una clase interna (tanto si es estatica como si no, da lo mismo) y trato de acceder a un atributo privado del mismo desde la clase externa no da error. ¿Por qué?

class ClaseExterna{
class ClaseInterna{private int atributoInterno = 7;}
int atributoExterno = new ClaseInterna().interna;//No da error de compilación
}

De echo, el error solo me lo da cuando trato de acceder a ese atributo privado desde fuera de la clase externa.
Entiendo que la clase interna pueda acceder a los miembros de la clase externa aunque sean privados, pero no entiendo por qué se puede hacer también lo contrario.

0xFer

#1
Cita de: 4dr14n31t0r en 19 Enero 2016, 12:13 PM
Ahora bien, si la clase interna es estatica, y al ser interna se considera un miembro del mismo al igual que sus atributos y métodos, entonces no debería de haber problema si creo un objeto de esa clase interna de la siguiente forma:ClaseExterna.ClaseInternaEstatica obj = ClaseExterna.new ClaseInterna();//Error de compilación
Sin embargo da error. ¿Por qué? ¿Por qué para crear un objeto debe ser, sin embargo, de la siguiente forma?ClaseExterna.ClaseInternaEstatica obj = new ClaseExterna.ClaseInternaEstatica();

Te da un error en parte porque la clase "ClaseInterna" no existe, bueno dejando eso a un lado, con la sintaxis que utilizas, imagina que hubiera más clases con el mismo nombre, al no usar "." sería difícil saber a qué clase haces referencia. Más legible es "new ClaseExterna.ClaseInternaEstatica();".


Cita de: 4dr14n31t0r en 19 Enero 2016, 12:13 PM
Otra duda: cuando implemento una clase interna (tanto si es estatica como si no, da lo mismo) y trato de acceder a un atributo privado del mismo desde la clase externa no da error. ¿Por qué?

class ClaseExterna{
class ClaseInterna{private int atributoInterno = 7;}
int atributoExterno = new ClaseInterna().interna;//No da error de compilación
}

De echo, el error solo me lo da cuando trato de acceder a ese atributo privado desde fuera de la clase externa.
Entiendo que la clase interna pueda acceder a los miembros de la clase externa aunque sean privados, pero no entiendo por qué se puede hacer también lo contrario.

Eso es algo muy normal, una clase puede ver todo lo que tiene. Por ejemplo tu tienes permisos para saber todo sobre tu mente y cuerpo, pero no tienes todos los permisos necesarios para saber todo sobre otras personas.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}