2011-07-29 14 views
5

Proste pytanie. Zrobiłem klasę o nazwie Tester1, która rozszerza inną nazwę o nazwie Tester2. Tester2 zawiera publiczny ciąg o nazwie "ABC".Java - użycie słowa kluczowego "super"

Oto Tester1:

public class Tester1 extends Tester2 
{ 
    public Tester1() 
    { 
     ABC = "Hello"; 
    } 
} 

Gdybym zamiast zmienić wiersz 5 do

super.ABC = "Hello"; 

ja nadal robi dokładnie to samo?

+2

To właściwie dobre pytanie. To dość powszechna wiedza, jak 'super' działa z przesłoniętymi metodami, ale pola różnią się. –

Odpowiedz

8

Tak. W twoim obiekcie jest tylko jedna zmienna ABC. Ale proszę, nie pozwól, aby pola były publiczne. Pola powinny zawsze być prywatne.

Jeśli zadeklarowana zmienna ABC ciągu Tester1 jak również, następnie nie byłoby różnicy - pole w Tester1 by hide polu w Tester2, ale przy użyciu super chcesz nadal być powołując się na polu w obrębie Tester2. Ale nie rób tego, albo - ukrywanie zmiennych jest naprawdę szybkim sposobem na uczynienie kodu nieosiągalnym.

Przykładowy kod:

// Please don't write code like this. It's horrible. 
class Super { 
    public int x; 
} 

class Sub extends Super { 
    public int x; 

    public Sub() { 
     x = 10; 
     super.x = 5; 
    } 

} 

public class Test { 
    public static void main(String[] args) { 
     Sub sub = new Sub(); 
     Super sup = sub; 
     System.out.println(sub.x); // Prints 10 
     System.out.println(sup.x); // Prints 5 
    } 
} 
+0

O ile nie jest statyczny. PO faktycznie nie powiedział, że nie był statyczny, ale ton wskazywał, że prawdopodobnie nie było. :) –

+0

@Ray: Tak, zakładam, że to nie jest statyczne ... –

+0

To nie jest statyczne. Świetny przykład i wyjaśnienie! – WildBamaBoy

1

Przede wszystkim zmienna ABC musi zostać zadeklarowana w klasie Tester2. Jeśli tak, to tak.

+0

Sądzę, że miałoby to znaczenie tylko wtedy, gdyby Tester 1 miał zmienną składową ABC, która zacieniała nadklasową zmienną ABC. – Kevin

1

Jesteś. Biorąc pod uwagę, że ABC jest widoczne dla Testera1 (klasa potomna), zakłada się, że jest ono zadeklarowane jako coś innego niż prywatne i dlatego jest widoczne dla podklasy. W tym przypadku użycie super.ABC po prostu wzmacnia fakt, że zmienna jest zdefiniowana w rodzicu.

Jeśli, z drugiej strony, ABC zostało oznaczone jako prywatne w klasie nadrzędnej, nie byłoby możliwości uzyskania dostępu do tej zmiennej z klasy dziecka - nawet jeśli użyto super (bez jakiejś wymyślnej refleksji, oczywiście) .

Inną rzeczą, na którą warto zwrócić uwagę, jest to, że jeśli zmienna została zdefiniowana jako prywatna w klasie nadrzędnej, można zdefiniować zmienną o dokładnie takiej samej nazwie w klasie potomnej. Ale znowu super nie przyznałby ci dostępu do zmiennej nadrzędnej.

2

Tak, super kwalifikator jest niepotrzebny, ale działa tak samo. Aby wyjaśnić:

public static class Fruit { 

    protected String color; 
    protected static int count; 
} 

public static class Apple extends Fruit { 

    public Apple() { 
     color = "red"; 
     super.color = "red"; // Works the same 
     count++; 
     super.count++; // Works the same 
    } 
} 
Powiązane problemy