2015-04-06 12 views
9

Ok tylko wiedzy sake, próbowałem poniżej przypadkach (Załóżmy, że klasa A i B są w tym samym opakowaniu)Dlaczego wyjątek lub błąd nie zostały wygenerowane, gdy nie znaleziono głównej metody?

ClassA

public class ClassA { 

    public static void main(String[] args) { 
    System.out.println("A"); 
    } 
} 

ClassB

public class ClassB extends ClassA { 

    public static void main(String[] args) { 
    System.out.println("B"); 
    } 
} 

wykonywania wyżej ClassB będzie produkować wyjście B teraz po niższej zmianie w klasie B

ClassB

public class ClassB extends ClassA { 
    //blank body 
} 

Jeśli mogę skompilować i uruchomić w terminal daje mi moc A że było zupełnie zaskakujące, jak powinno dał NoSuchMethodError jako głównego sposobu nie było ich tak uprzejmie wyjaśnić dziwne zachowanie?

Uwaga: Wiele odpowiedzi zawiera Override słowo Proszę używać hiding jak my nie mogą przesłonić metody statyczne w Javie.

+1

Nie ma metody "statycznej" przesłonięcia, ale ** ukrywa się **. W pierwszym przypadku 'ClassB' ukrywa metodę' main' z 'ClassA'. W drugim przypadku 'ClassB' nie ukrywa metody' main', więc wywoływana jest z 'ClassA'. –

Odpowiedz

7

W pierwszym przypadku ukrywa się metoda main, ponieważ definiuje się nową w podklasie, w drugim przypadku nie będziesz się wpisywać w główny nurt A.

Patrz The Java™ Tutorials - Overriding and Hiding:

przypadku podklasy definiuje metody static z tego samego podpis jako static metody w nadrzędnej wówczas sposób w podklasyskór jeden w nadklasa.

+0

Nie możemy zastąpić metod statycznych, jak mówi java :) –

+1

@BhargavModi Rzeczywiście, przesłonięcie jest złym słowem. Naprawiony. – Maroun

+0

@ Maroun Maroun, to jest to, co udowodniłem na moich zajęciach. @ Boris the Spider; spróbuj wykonać. –

0

public static void main(String[] args) to tylko metoda, którą dziedziczy się po A w drugim przypadku.

2

W klasach Java dziedziczą wszystkie metody ich klas podstawowych, w tym ich metody statyczne.

Definiowanie metody instancji w podklasie z pasującą nazwą i parametrami metody w nadklasie jest nadpisaniem. Wykonanie tego samego dla metod statycznych ukrywa metodę nadklasy.

Ukrywanie nie oznacza, że ​​metoda znika, jednak: obie metody pozostają możliwe do wywołania z odpowiednią składnią. W pierwszym przykładzie wszystko jest jasne: zarówno A, jak i B mają własne main; dzwonienie pod numer A.main() drukuje A podczas wywoływania B.main() wydruków B.

W twoim drugim przykładzie dozwolone jest również wywoływanie B.main(). Od main jest dziedziczone po A, wynikiem jest drukowanie A.

Powiązane problemy