2009-08-28 20 views
12

Ho due domanda su questo codiceConfondere "l'override un metodo privato"

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) Come è la funzione f è visibile sul riferimento di Override Po;

2) Perché è uscita "f privato()"

+0

Ma come un riferimento con un oggetto di sottoclasse può chiamare un metodo privato di una super classe ??? è un insetto??? –

+0

No, questo non è un bug, questo è esattamente come dovrebbe funzionare. – Jesper

+0

ma non è questo che viola le regole di ereditarietà e l'associazione tardiva –

risposta

24
  1. Il metodo main è dentro di classe Override, così naturalmente è possibile vedere i membri privati ​​della classe Override.

  2. Sei non metodo primario f in classe Derived, non v'è alcun polimorfismo. Il tipo della variabile po è Override, quindi sarà necessario il metodo f dalla classe Override.

Si noti che il metodo f in classe Override non è visibile a tutti in classe Derived. Il metodo f nella classe Derived è un metodo diverso, che non ha nulla a che fare con il metodo f nella superclasse.

+0

Ma quando l'associazione viene eseguita in fase di esecuzione, allora po avrà l'oggetto della classe Derivata così come è in grado di chiamare un metodo privato di super-classe. –

+3

In nessuna parte del codice è presente una chiamata a un metodo privato di una superclasse. Quando chiami po.f(), viene chiamata f di Override perché il tipo di po in fase di compilazione è Override. Dal momento che non esiste alcuna sovrascrittura, non esiste alcun legame dinamico (nessun polimorfismo) - Java non considera il tipo in fase di esecuzione. – Jesper

2
Override po = new Derived(); 
po.f(); 

Si accede proprio metodo di Override anche se l'oggetto è derivato, perché come da regole di visibilità, i membri privati ​​della classe sono considerati un primo momento, e come il suo scritto in ambito di Override si fa riferimento alla f privato, e dal momento che non è sovrascritto nella classe Derived, verrà sovrascritto solo se la firma del metodo è la stessa.

Derived po = new Derived(); 
po.f(); 

Thsi è il codice corretto che chiamerà di Derivato f

+0

La domanda riguarda Java, non C#. 'virtuale' non esiste in Java. – Jesper

+0

Grazie per il commento, ho risolto anche l'answwer. –

0

L'override del metodo ha tre must classe conditions.child ha lo stesso nome e parametri e il valore restituito come la sua super class.But se entrambi il parametro e valore restituito sono variano, quindi l'override non è esiste, anche se le due modalità sono diverso metodo ok in questo modo:!!!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipse non parlerà errore! perché il metodo addV nella classe Child è diverso con il metodo addV nella classe Parent.As la tua istanza!

+0

Solo il nome del metodo e l'elenco di argomenti devono essere esattamente gli stessi. Il valore di ritorno del figlio potrebbe essere una sottoclasse del valore di ritorno del genitore. E ci sono altre due regole che hai omesso. Il metodo nel bambino deve essere almeno accessibile come quello in genitore. E la sottoclasse non può lanciare nuove eccezioni controllate o più ampie. – pkkoniec

Problemi correlati