2009-08-28 11 views
12

mam dwa pytanie o kodMyląc „zastąpić prywatną metody”

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) Jak to funkcja f jest widoczne w nawiązaniu do override PO;

2) Dlaczego jest wyjście "prywatne f()"

+0

Ale w jaki sposób odniesienie do obiektu podklasy może wywołać prywatną metodę superklasy? czy to błąd? –

+0

Nie, to nie jest błąd, to jest dokładnie to, co powinno działać. – Jesper

+0

, ale nie jest to naruszenie zasad dziedziczenia i późnego wiązania –

Odpowiedz

24
  1. Sposób main jest wewnątrz klasy Override, więc oczywiście można go zobaczyć prywatne członków klasy Override.

  2. Jesteś nie nadrzędnym metoda f w klasie Derived, nie ma polimorfizm. Typ zmiennej po jest Override, więc przyjmie metodę f z klasy Override.

Należy zauważyć, że metoda f w klasie Override nie jest widoczny na wszystkich w klasie Derived. Metoda f w klasie Derived jest inną metodą, która nie ma nic wspólnego z metodą f w nadklasie.

+0

Ale gdy wiązanie zostanie wykonane w czasie wykonywania, to po będzie miało obiekt klasy pochodnej, więc w jaki sposób jest w stanie wywołać prywatną metodę super klasy. –

+3

Nigdzie w twoim kodzie nie ma połączenia z prywatną metodą nadklasy. Kiedy wywołujemy po.f(), wywoływana jest f Override, ponieważ typem kompilacji po jest Override. Ponieważ nie ma nadpisywania, nie ma wiązania dynamicznego (brak polimorfizmu) - Java nie patrzy na typ w czasie wykonywania. – Jesper

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

łączysz własną metodę przesłonić, nawet jeśli obiekt pochodzi ponieważ zgodnie z przepisami zakresie, prywatne członkowie grupy są uważane za pierwszy, a jako jego pisemne w zakresie nadpisać odwołuje prywatny F i ponieważ jego prywatny nie jest w ogóle nadpisywany w klasie pochodnej, będą one zastępowane tylko wtedy, gdy podpis metody będzie taki sam.

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

Thsi jest poprawny kod, który wezwie potomnej f

+0

Pytanie dotyczy języka Java, a nie języka C#. "wirtualny" nie istnieje w Javie. – Jesper

+0

Dzięki za komentarz, poprawiłem również odpowiedź. –

0

Korekcja metody ma trzy conditions.child klasie muszą ma taką samą nazwę i parametry i zwracane wartości jako jego super-class.But gdy oba parametr i zwracana wartość jest różna, więc nadpisanie nie istnieje, nawet jeśli dwie metody są różne metody ok tak:!!!

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 nie będą rozmawiać błąd! ponieważ metoda addV w klasie Dziecko jest inna w przypadku metody addV w klasie Parent.As your instance!

+0

Tylko nazwa metody i lista argumentów muszą być dokładnie takie same. Zwracana wartość elementu podrzędnego może być podklasą wartości zwracanej przez rodzica.I są jeszcze dwie reguły, które pominąłeś. Metoda u dziecka musi być przynajmniej tak samo dostępna, jak ta u rodzica. A podklasa nie może wyrzucać nowych zaznaczonych wyjątków ani szerszych. – pkkoniec

Powiązane problemy