2012-05-16 15 views
7

Empecé a escribir mi primer Java program.¿Cómo es que la clase que contiene el método principal no está instanciada y todavía está bien en Java?

class HelloWorldApp { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

El programa funciona bien solo con el código anterior. Pero según mi conocimiento OOP, un class es solo un concepto abstracto y no cobra vida hasta que creas un objeto de este tipo. Y luego, a través de ese objeto llamamos a los métodos/funciones dentro de la clase.

Sin embargo, en este ejemplo en particular, parece que main método se llama incluso sin crear un objeto de la classHelloWorldApp

es el objeto creado en otro lugar? Si es así, ¿cómo sabe esa parte del código mi class nombre HelloWorldApp?

Respuesta

10

Es porque es static método, y por eso no es necesario crear la instancia

JVM cargar la clase HelloWorldApp y se invocará método estático en ella, Y puesto que es JVM público (siendo externa) puede acceder a este método


también Consulte

+0

¿Eso significa que puedo llamar alrededor de cualquier función estática dentro de cualquier otra clase? ¿No minimiza el concepto de encapsulación? –

+0

sí puede, los campos/métodos estáticos están asociados con la clase (por clase cargada y no con el Objeto), si son públicos, puede hacerlo –

+2

La encapsulación no es una regla impuesta por el compilador sino un principio que los programadores utilizar para tratar de crear un mejor código. El lenguaje y el compilador pueden ayudarnos a lograr la encapsulación, pero no nos la imponen. Incluso un lenguaje orientado a objetos puro como Smalltalk no te obliga a seguir la encapsulación. En Smalltalk, sin embargo, las clases son en sí mismos objetos reales para que pueda enviarles mensajes a los que responden. Incluso puede heredarlos en subclases y hacer que las subclases invoquen super. –

3

Punto de partida para una aplicación Java (no siempre) es este método

public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 

Al hacer java className va a ir y comprobar si la clase tiene un método principal, desde su estática que puede ser llamado sin crear una instancia.

Si no hay un método principal o principal, pero no con la misma firma, se lanzará un RuntimeException indicando que no se encontró el método principal.

No olvides leer A closer look at main method.

fuera de tema:

La extensión de la misma idea, que no necesitan una instancia de una clase para hacer referencia a su método estático y campos.

public class MyClass { 
    public static int NUMBER = 10; 

    public static void String sayHello(){ 
    return "Hello"; 
    } 

    public void String sayBye(){ 
    return "Bye"; 
    } 

    public static void main(String[] args){ 
    System.out.println(NUMBER); // No need for object 
    System.out.println(sayHello()); // No need for object 
    System.out.println(new MyClass().sayBye()); // sayBye is not accessible at class level have to have an object of MyClass to access sayBye 
    } 
} 

Si ése se le llama en alguna otra clase, entonces puede verse como:

public class MyClassCaller { 
    public static void main(String[] args){ 
    System.out.println(MyClass.NUMBER); // No need for object just refer the class 
    System.out.println(MyClass.sayHello()); // No need for object just refer the class 
    System.out.println(new MyClass().sayBye()); // sayBye is not accessible at class level have to have an object of MyClass to access sayBye 
    } 
} 

Una discusión agradable en el uso/sobreuso de static methods

1

principal método es estático que no se necesita una instancia

Cuestiones relacionadas