2012-02-29 10 views
5

Al usar C++ no se permite el acceso a un atributo privado dentro de una función principal. Ejemplo:¿Cuál es la idea detrás del acceso de atributos privados dentro de main? Java x C++

#include <iostream> 
using namespace std; 
class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
}; 
int main (int argc, char *argv[]) { 
    Test test2(4); 
    cout << test2.a; // Compile error! Test::a is private within this context 
    cout << test2.getValue(); // OK! 
    return 0; 
} 

Está claro por qué hay un error al acceder a los atributos privados fuera de los métodos de clase, ya que C++ no tienen funciones principales dentro de las clases.

Sin embargo, en Java se permite:

public class Test { 
    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 
    public static void main (String args[]) { 
     Test test1 = new Test(4); 
     System.out.println(test1.a); 
    } 
} 

entiendo en este caso principal está dentro de la clase de prueba. Sin embargo, no puedo entender la idea de POR QUÉ está permitido, y cuál es el impacto de esto en el desarrollo/administración del código.

Cuando el aprendizaje de C++, una vez oído "Las clases no deben tener un plato principal. Principal actúa con o usa instancias de clases".

¿Alguien puede arrojar algo de luz sobre esta pregunta?

+0

'main' prácticamente tiene que vivir dentro de una clase en Java, ya que sería ilegal que viva fuera de una clase. No hay un alcance global para las funciones en Java. – Dervall

+3

Siempre acabo de tener el punto de entrada principal en una clase con nada más que la función principal. Realmente no tiene sentido tener el principal en una clase para mí tampoco. – L7ColWinters

+1

Por las respuestas hasta ahora, creo que esta fue una elección de los desarrolladores de lenguaje: no hacer excepciones a Main(), incluso si se tratara de una función especial, otorgando el acceso que tendría cualquier otro método. –

Respuesta

6

usted está mirando esto desde el punto de vista equivocado.La pregunta no es por qué principal puede acceder a la clase interna. No hay uno 'principal' en Java. La diferencia importante a este respecto es que para C++ hay un único punto de entrada en la aplicación que es principal, mientras que en Java una sola aplicación puede tener múltiples puntos de entrada, hasta uno por clase. El punto de entrada debe ser un método estático (función de miembro en la jerga de C++) de una clase con una firma particular, y el comportamiento es exactamente el mismo que para otros métodos estáticos de la misma clase. El motivo por el cual Java puede tener múltiples puntos de entrada es que le dice a la VM en el inicio dónde (en qué clase) desea iniciar su aplicación. Esa es una característica que no está disponible en C++ (y en muchos otros idiomas)

+0

Gracias. Eso es muy interesante, realmente no estaba mirando este punto de vista. –

5

En realidad se puede hacer lo mismo en C++:

class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
     static void Main() 
     { 
      Test t(10); 
      cout << t.a; 
     } 
}; 

Es tan simple como eso: en ambos idiomas, private las variables son accesibles sólo desde el interior de la clase.

Sin embargo, no puedo entender la idea de POR QUÉ está permitido.

Es sólo una característica del lenguaje. Si no pudieras acceder a las partes privadas desde el interior de la clase, ¿qué harías con ellas?

Además, no es que los niveles de acceso son a nivel de clase, no toda la instancia. Eso podría estar tirando de ti. Eso significa que puede acceder a partes privadas de una instancia diferente desde una instancia de la misma clase. Además, en C++, está la palabra clave friend que le otorga los mismos privilegios.

+0

Luchain, entiendo esto, pero en este caso esta función Main dentro de la clase no es una main() correcta. No compila sin OTRO principal fuera de la clase. ¿No es correcto? Pero en Java compila, ejecuta y todo está bien. –

+0

@MoacirPontiJr. sí. ¿Y? 'main()' es solo el punto de entrada en C++, así como 'MyClass :: main()' está en Java. –

2

Su intuición es correcta. El segundo código es válido en Java porque main está dentro de la clase Test. Para que sea equivalente a la prueba de código C++ para acceder al miembro privado de una clase diferente, lo que se producirá un error de compilar:

class Test2 { 

    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 

} 

public class Test { 

    public static void main (String args[]) { 
     Test2 test2 = new Test2(4); 
     System.out.println(test2.a); // does not compile 
    } 
} 

La diferencia subyacente real es el hecho de que en C++ funciones pueden existir fuera de las clases, mientras que en Java cualquier método debe ser parte de una clase.

0

Este motivo es: Java es un modelo totalmente Object Oriented Programming, por lo que en él debe definirse cualquier cosa en la clase o la unidad más pequeña en Java es clase.

+0

* programación completamente orientada a objetos * ... No me hagas comenzar, el hecho de que estés * forzado * a convertir todo en una clase no significa que esté * completamente * orientado a objetos. Python está más orientado a objetos que Java por lo que importa ... –

+0

No comparo Python con Java aquí. – MJM

+1

mi diatriba es sobre todas las personas que afirman que Java es 100% OO porque obliga a que todo esté contenido en una clase, y eso es falso. También (lado no si lo desea) proporcioné un ejemplo de un idioma que es más OO que Java y tiene funciones que no son miembros de clases, con la intención de hacer más explícito que los dos conceptos no son realmente lo mismo. Tenga en cuenta que al proporcionar un ejemplo estrictamente más OO, se puede inferir que Java no puede ser 100% OO. –

1

private en Java podría ser considerado "archivo local" compárese paquete local. Por ejemplo, puede acceder a miembros privados de una clase definida en la misma clase externa.

AFAIK, La suposición es que no necesita protegerse del código en el mismo archivo.

public interface MyApp { 
    class Runner { 
     public static void main(String... args) { 
      // access a private member of another class 
      // in the same file, but not nested. 
      SomeEnum.VALUE1.value = "Hello World"; 
      System.out.println(SomeEnum.VALUE1); 
     } 
    } 

    enum SomeEnum { 
     VALUE1("value1"), 
     VALUE2("value2"), 
     VALUE3("value3"); 
     private String value; 

     SomeEnum(final String value) { 
      this.value = value; 
     } 
     public String toString() { 
      return value; 
     } 
    } 
} 

http://vanillajava.blogspot.com/#!/2012/02/outer-class-local-access.html

Cuestiones relacionadas