2012-05-16 14 views
7

Zacząłem pisać mój pierwszy Java program.Dlaczego klasa zawierająca główną metodę nie jest instancjonowana i nadal działa poprawnie w Javie?

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

Program działa dobrze tylko z powyższym kodem. Ale zgodnie z moją wiedzą OOP, class jest tylko abstrakcyjną koncepcją i nie ożywa, dopóki nie stworzysz obiektu tego rodzaju. A następnie, poprzez ten obiekt, nazywamy metody/funkcje wewnątrz klasy.

Ale w tym konkretnym przypadku wydaje się, że main metoda nazywana jest nawet bez tworzenia przedmiotu classHelloWorldApp

Czy przedmiot stworzony gdzieś indziej? Jeśli tak, to w jaki sposób ta część kodu zna moją class imię i nazwisko ?

Odpowiedz

10

To dlatego, że jest static sposób, a do tego nie trzeba można utworzyć instancji

JVM załaduje klasę HelloWorldApp i będzie wywoływać metody statycznej na nim, a ponieważ jest JVM publicznych (będących zewnętrzne) mogą uzyskać dostęp do tej metody


Zobacz także

+0

Czy to oznacza, że ​​mogę wywoływać statyczne funkcje w innych klasach? Czy nie bagatelizuje koncepcji enkapsulacji? –

+0

Tak, możesz, statyczne pola/metody są powiązane z klasą (na klasę załadowaną, a nie z Object), jeśli są publiczne, możesz to zrobić –

+2

Enkapsulacja nie jest regułą wymuszoną przez kompilator, ale zasadą, że programiści użyj, aby spróbować stworzyć lepszy kod. Język i kompilator mogą nam pomóc osiągnąć hermetyzację, ale nie zmuszają nas do tego. Nawet czysty obiektowy język, taki jak Smalltalk, nie zmusza do podążania za hermetyzacją. W Smalltalk klasy same w sobie są prawdziwymi obiektami, więc możesz wysyłać im wiadomości, na które reagują. Możesz nawet dziedziczyć je w podklasach i wywoływać superklasy podklas. –

3

Punkt startowy dla aplikacji Java (nie zawsze) jest to metoda

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

Kiedy robisz java className będzie pójść i sprawdzić, czy klasa ma główny sposób, ponieważ jej statyczne może być wywoływane bez tworzenia instancji.

Jeśli nie ma głównej metody lub głównej metody, ale nie z tą samą sygnaturą, to wyrzuci ona RuntimeException stwierdzając, że nie znaleziono metody głównej.

Nie zapomnij przeczytać A closer look at main method.

off topic:

Rozszerzanie ten sam pomysł, nie trzeba instancję klasy odwołać swoje metody statycznej i polami.

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 
    } 
} 

Jeśli sam nazywa się w jakiejś innej klasy to może wyglądać następująco:

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 
    } 
} 

Ładna dyskusja na wykorzystanie/overusage z static methods

1

głównej metody jest statyczny, który nie potrzebuje instancja