2013-04-17 11 views
5

Widziałem niektóre przykłady języka Java, które używają słowa kluczowego this, aby uzyskać metody nadklasy. Przykład: this.superClassMethod(). W zwykłym przypadku użyjemy super. Czy ktoś mógłby pomóc w wyjaśnieniu z przykładem, dlaczego programista użył this zamiast super? Dziękuję Ci.Dlaczego używać słowa kluczowego "this", aby uzyskać metody nadklasy?

+0

Czy metoda została nadpisana w podklasie? –

Odpowiedz

17

Nie ma różnicy między i super.method() aż wspomnianego method() dostaje zamienione na w klasie rozmówcy.

Na przykład, z

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Wywołanie

new SubClass(); 

Drukuje

SuperClass 
SuperClass 
SuperClass 

Choć z

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    @Override 
    public void method() { 
     System.out.println("SubClass"); 
    } 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Wywołanie

new SubClass(); 

Drukuje

SubClass 
SubClass 
SuperClass 

Równolegle, nie ma różnicy między this.field i super.field aż wspomnianego field dostaje ukryte w klasie rozmówcy.

Na przykład, z

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Wywołanie

new SubClass("parameter"); 

Drukuje

parameter 
SuperClass 
SuperClass 

Choć z

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    private String field = "SubClass"; 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Wywoływanie

new SubClass("parameter"); 

Drukuje

parameter 
SubClass 
SuperClass 

marginesie: methods() się nadpisane podczas fields się ukryty.

+1

+1 za zwięzłe zdanie klucza "nie ma różnicy między this.method() i super.method(), dopóki wspomniana metoda nie zostanie nadpisana w klasie dzwoniącego." – TheBlastOne

+4

Wszystko to jest prawdą, ale można ją skrócić do: Jeśli chcesz wywołać metodę superklasową, użyj 'super', w przeciwnym razie nie rób nic tak jak domyślnie (bez użycia' this') zawsze będzie używana "najnowsza implementacja". –

+0

Dzięki człowieku. W końcu to dostałam – gjman2

5

Używanie this nie wywołuje metody nadklasy. W rzeczywistości jest to zbyteczne, ponieważ specyficznie wywołuje metodę tej instancji. Może to być istotne, jeśli chcesz wywołać inny konstruktor tej samej instancji, ale poza tym jest tak samo, jak po prostu wywołanie metody.

Może to być przydatne do określania zakresu zmiennych (na przykład, gdy istnieje zmienna lokalna o tej samej nazwie, co zmienna instancji), aby upewnić się, że użyto zmiennej instancji, ale nie ma to znaczenia podczas wywoływania metod.

Osobiście myślę, że deweloper chciał skorzystać z uzupełniania kodu i IDE pokazuje możliwe po wprowadzeniu nazwy metody this. :-)

+0

@TheBlastOne Co? –

+0

Wrong slot: O przepraszam – TheBlastOne

+0

OK, początkowo byłem zdezorientowany :-D –

3

Super służy do metod dostępowych klasy bazowej, podczas gdy ten jest używany do dostępu do metod obecnej klasy.

Kilka odnośników
1) usage of this
2) critique on super on SO

Rozszerzanie pojęcia, jeśli piszesz super(), odnosi się do konstruktora klasy bazowej, a jeśli piszesz to(), to odnosi się do konstruktora klasy, w której piszesz ten kod.

class Animal { 
    void eat() { 
    System.out.println("animal : eat"); 
    } 
} 

class Dog extends Animal { 
    void eat() { 
    System.out.println("dog : eat"); 
    } 
    void anotherEat() { 
    super.eat(); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
    Animal a = new Animal(); 
    a.eat(); 
    Dog d = new Dog(); 
    d.eat(); 
    d.anotherEat(); 
    } 
} 

Wyjście będzie

animal : eat 
dog : eat 
animal : eat 

Trzecia linia drukuje "zwierzę eat" dlatego wzywamy super.eat(). Gdybyśmy nazwali this.eat(), wydrukowałoby to jako "pies: jedz".

+0

Odwołanie "critique on super" w rzeczywistości dotyczy właśnie wywoływania 'super()' od konstruktora, a nie ogólnego pojęcia wywoływania 'super. '. – rob

+0

Dlaczego nie dodać ostatniego przykładu, o którym wspomniałeś, do klasy 'Test' i danych wyjściowych? ;) – rob

0

Wiele kodów java/sun java używa tego. kiedy nie trzeba przykład patrz Java \ AWT \ Event.java #translate

public void translate(int dx, int dy) { 
    this.x += dx; 
    this.y +=  
} 

(jeśli wyodrębnić src.zip i poszukać. w * .java będzie zobaczyć wiele przykładów takich jak ten, w którym jest bez przesłonięcia zmiennej lokalnej/paramu, ale nadal używają tego stylu:

Nic nie ma związku z parametrami lub automatycznym uzupełnianiem (jest to po prostu x) Uważam, że jest to standard kodowania, aby było jasne, że mówimy o metodzie lub polu current/this class.

Metoda podstawowa klasy: Nawet jeśli jeszcze nie przejechaliśmy w naszej klasie ss, może być w późniejszym terminie, więc jego przyszłość jest gotowa. Dopóki metoda nie zostanie nadpisana, działa dobrze, a jeśli jest przekroczona, to jest dokładna.

Uważam więc, że jest to najlepsza praktyka w zakresie kodowania w celu zachowania przejrzystości. To nie będzie nadpisywać kodu, ponieważ nie pisanie to tylko cukier składniowy, a kompilator doda go do kodu klasy.

Powiązane problemy