2012-10-25 11 views

Odpowiedz

8

Najważniejsza różnica to między statycznymi i dynamicznymi typami obiektów oraz odniesieniami do obiektów.

Powiedz, że B rozszerza A i C, rozszerza B.

Dynamiczny typ obiektu (typ używany w nowym) jest faktycznym typem środowiska wykonawczego: określa rzeczywiste metody obecne dla obiektu.

Statyczny typ odwołania do obiektu (zmienna) jest typem kompilacji: definiuje lub raczej deklaruje, które metody można wywołać na obiekcie, do którego odnosi się zmienna.

Statyczny typ zmiennej powinien być zawsze tego samego typu lub nadtypem dynamicznego typu obiektu, do którego się odnosi.

Tak więc w naszym przykładzie, zmienna ze statycznym typu A mogą odwoływać obiektów z dynamicznym typu A, B i C. zmiennej ze statycznym typu B może odwoływać obiektów z dynamicznym typu B i C. zmiennej z typem statycznym C może odwoływać się tylko do obiektów z dynamicznym typem C.

Wreszcie, wywołanie metody na odwołaniu do obiektu jest subtelną i złożoną interakcją między typami statycznymi i dynamicznymi. (Przeczytaj specyfikację języka Java na temat wywoływania metody, jeśli mi nie wierzysz.)

Jeśli zarówno A, jak i B realizują na przykład metodę f(), a typ statyczny to A, a typ dynamiczny to C dla metoda a inwokacja, potem Bf() zostanie wywołany:

B extends A, C extends B 
public A.f() {} 
public B.f() {} 
A x = new C(); // static type A, dynamic type C 
x.f(); // B.f() invoked 

Uproszczenie znacznie: najpierw statyczne typów zarówno odbiornika (typ a) i argumentów (bez args) są wykorzystywane do decydowania o najlepszym dopasowaniu (najbardziej specyficzny) podpis metody dla tego konkretnego wywołania, i to jest wykonywane podczas kompilacji. Tutaj jest to wyraźnie A.f().

Następnie, w drugim kroku w czasie wykonywania, typ dynamiczny służy do zlokalizowania rzeczywistej implementacji naszego podpisu metody. Zaczynamy od typu C, ale nie znajdujemy implementacji f(), więc przechodzimy do B, a tam mamy metodę B.f(), która pasuje do sygnatury A.f(). Zatem wywoływana jest funkcja B.f().

W naszym przykładzie mówimy, że metoda B.f() przesłania metodę A.f(). Mechanizm nadpisywania metod w hierarchii typów nazywany jest polimorfizmem podtypu.

+0

bardzo dobrze wyjaśnione !! – Rohit

2

Przypadek 1:

Zobaczysz różnicę, gdy masz metody w B która nie jest .

Gdy spróbujesz wywołać tę metodę za pomocą odniesienia "x", nie będzie ona widoczna.

Przypadek 2:

Wszystkie połączenia metoda będzie na podstawie typu obiektu nie oznaczenie typu due polimorfizm (z wyjątkiem metody statyczne)

A x = new B(); 

W tym przypadku B klasa run_function zostanie wykonany.

A x = new A(); 

W tym przypadku A klasa run_function zostanie wykonany.

1
  1. Nie ma prawdziwej różnicy. Właściwie dla drugiego przypadku A stara obiekt B, ale B to A, więc nie ma problemu. B w tym przypadku zachowuje się jak A.

  2. Będzie ona nazywać run_function B()

6

1. W

A x = new A(); 

x stanowi konkretyzacji A i typu A.

natomiast w

A x = new B(); 

x jest instancji z B i typu A.


2. Ważne jest, aby pamiętać, jest to, że (w drugim przypadku) jeśli zadzwonisz x.someMethod(), metoda B zostanie wywołana, nie sposób A (jest to o nazwie wiązanie dynamiczne, w przeciwieństwie do wiązania statycznego ). Ponadto, casting zmienia tylko typ, więc

A x = new B(); 
((A)x).run_function(); // Need extra parenthesis! 

będzie nadal wywołać metodę B „s.


Jak powiedziałem powyżej, muszą zawierać te dodatkowe nawias od

(A)x.run_function(); 

jest równoważna

(A)(x.run_function()); 
1

Ponadto z: Ty

A x = new B() 

nie będzie być w stanie wykonać metody th at są zdefiniowane w B i które nie są zdefiniowane w A. Jednak, jak wskazano wcześniej, z powodu polimorfizmu w Javie, jeśli wykonasz dowolne metody i B' zastąpił te metody, użyje ono implementacji B.

2
1.What is the difference between: A x = new A();and A x = new B(); 

Różnica polega na tym, że w pierwszym przypadku, jesteś instancji klasę typu A. Tak będzie tylko w stanie wywołać metody zdefiniowane w A. W drugim przypadku, jeżeli ta sama metoda nazwa istnieje w zarówno A, jak i B, wtedy implementacja B zostanie wywołana w czasie wykonywania.

Jednak w tym drugim przypadku, przy użyciu odbicia, będzie również możliwe do wywołania metody, które są zdefiniowane w klasie B, a nie w klasie A.

A x = new B(); (A)x.run_function(); Załóżmy, że A i B mają funkcja run_function, która z nich zostanie wykonana?

Pamiętaj - Nadrzędne decyzje są podejmowane w czasie wykonywania, podczas gdy przeciążanie jest ustalane podczas kompilacji.

Metoda w klasie B będzie wywoływana w czasie wykonywania na podstawie powiązania dynamicznego.

+0

Nadrzędne ustawienie nie jest ustalane w czasie wykonywania. Opiera się na podklasach, metodzie sygnatur i widoczności, z których wszystkie są pojęciami statycznymi. Tak więc kompilator wie o nadpisywaniu i nadpisywaniu metod. – eljenso

+1

Która przesłonięta metoda wywołania jest określana w czasie wykonywania. –

+0

Nie, wiązanie dynamiczne dzieje się w czasie wykonywania. –

Powiązane problemy