2013-05-31 10 views
7
class Parent 
{ 
    private void method1() 
    { 
     System.out.println("Parent's method1()"); 
    } 
    public void method2() 
    { 
     System.out.println("Parent's method2()"); 
     method1(); 
    } 
} 
class Child extends Parent 
{ 
    public void method1() 
    { 
     System.out.println("Child's method1()");   
    } 

    public static void main(String args[]) 
    { 
     Child p = new Child(); 
     p.method2(); 
    } 
} 

ans èuscita Perchè ereditarietà è inaspettato

Parent's method2() 
Parent's method1() 

Se sto creando oggetto della classe bambino allora perché l'uscita è di metodo di classe genitrice ?? anche method1 è privato in parent. Scuote il mio concetto di ereditarietà.

risposta

13

Chiamerebbe il metodo figlio se ha annullato il metodo genitore. Ma non lo fa, dal momento che il metodo genitore è privato, e quindi non può essere sovrascritto.

Se si intende sovrascrivere un metodo da una classe genitore o un'interfaccia, è sempre necessario annotare il metodo con @Override. Se lo facessi, in questo caso, riceverai un errore dal compilatore, poiché il metodo figlio1 non sovrascrive alcun metodo.

Quando la classe genitrice è compilata, il compilatore cerca il metodo1 nella classe Parent. Lo trova e vede che è privato. Dal momento che è privato, sa che non è sovrascrivibile da alcuna sottoclasse e quindi lega staticamente la chiamata al metodo che ha trovato.

Se method1 era protetto o pubblico, il compilatore trovava il metodo e sapeva che il metodo poteva essere sostituito da una sottoclasse. Quindi non legherebbe staticamente al metodo. Invece, genererebbe bytecode che cercherebbe il metodo1 nella classe concreta, in fase di esecuzione, e si otterrebbe il comportamento che ci si aspetta.

Pensateci: se una sottoclasse potrebbe sovrascrivere un metodo privato, il metodo non sarebbe più privato.

+0

sì lo so. Ma sto facendo oggetto di classe figlio. –

+0

@ankitagahoi Non vedo il punto di "ma" nella tua affermazione :) –

+0

Se questo è oggetto classe figlio e classe figlio con metodo1, allora non è il caso di sovrascrivere. Child p = new Child(); –

1

I membri privati ​​non vengono ereditati dalle classi figlio. Pertanto stai semplicemente definendo uno public void method1 completamente indipendente nella sottoclasse. Naturalmente, non partecipa alla spedizione dinamica.

2

per impostazione predefinita la classe figlio avrà accesso al metodo padre. stai chiamando p.method2() ... che non esiste nella classe Child quindi sta eseguendo dal genitore ...

Anche se method1() è privato è padre .. viene chiamato dal metodo locale cioè method2() ... quindi method1() ha accessibilità in method2() ....

Problemi correlati