2015-08-14 18 views
5
public class B { 

    public B() { 

    } 

    private void m0(){ 
     System.out.println("BO"); 
    } 
    public void m1(){ 
     System.out.println("B1"); 

    } 

    public void test(){ 
     this.m0(); 
     this.m1(); 
    } 
} 



public class D extends B{ 

    /** 
    * 
    */ 
    public D() { 

    } 

    public void m0(){ 
     System.out.println("DO"); 
    } 
    public void m1(){ 
     System.out.println("D1"); 

    } 

    public void test(){ 
     super.test(); 
    } 

    public static void main(String[] args) { 
     B d=new D(); 
     d.test(); 
    } 


} 

mia domanda è perché l'uscita è BO,D1 invece di BO,B1. Non riesco a capire come la parola chiave super svolge il ruolo di chiamare i metodi della classe figlio anziché della classe genitore.Come la Parola Chiave opere eccellenti in java-Java Puzzle

risposta

8

Poiché il metodo di m0 in classe B è privato, non viene sostituito per classe D.

1

Così la parola chiave super assicurarsi che la versione della funzione di test che si chiama è dalla classe super (in particolare B. test() al contrario di chiamare recusivamente D.test()).

Ma questo non risponde esattamente alla tua domanda.

Il motivo per cui il secondo termine è D1 non B0, poiché D.m1() sovrascrive polimorficamente B.m1().

Il motivo per cui il primo termine è B0 non D0, perché D.m0() NON sostituisce B.m0() perché b.m0 è privato.

0

Il metodo m0 è privato nella classe B. Quindi, quando si eredita, il metodo m0 è privato e non è ereditato nella classe D. Quindi, viene eseguito il metodo m0 della classe B e viene stampato "BO".

Ma quando viene eseguito questo.m1(), viene sovrascritto dal metodo m1 nella classe D. Quindi stampa "D1"