this
i
super
są dwoma specjalnymi słowami kluczowymi w Javie, które reprezentują odpowiednio bieżącą instancję klasy i jej nadklasy. Programiści Java często mylą te słowa i wykazują niewielką świadomość ich specjalnych właściwości, o które często pytają w wywiadach Java Core. Na przykład kilka pytań, które od razu przychodzą na myśl ,
this
brzmi
super
: i Czy można przypisać inne znaczenie słowu kluczowemu
this
w Javie? i jaka jest różnica między słowami kluczowymi
this
a
super
w Javie. Nie wiem? Cóż, nie podam tutaj odpowiedzi – znajdziesz ją na końcu artykułu.
Tak więc, jak powiedziałem na początku, główna różnica między
this
i
super
w Javie polega na tym, że
this
bieżąca instancja klasy reprezentuje, podczas gdy
super
bieżąca instancja klasy nadrzędnej reprezentuje. Oto jeden z przykładów wykorzystania zmiennych
this
oraz
super
– zapewne widzieliście już przykłady wywoływania konstruktorów jednych od drugich, tzw. wywoływanie konstruktorów w łańcuchu, jest to możliwe poprzez użycie słów kluczowych
this
i
super
. Wewnątrz klasy używany jest konstruktor bezargumentowy,
this()
natomiast
super()
do wywoływania konstruktora bezargumentowego lub, jak się to nazywa, domyślnego konstruktora klasy nadrzędnej. Swoją drogą w ten sposób można wywołać nie tylko konstruktora bez argumentów, ale także dowolnego innego konstruktora przekazując mu odpowiednie parametry. Wkrótce zobaczymy przykład takiego
this
zastosowania
super
. Również w
this
Javie
super
są one używane do uzyskiwania dostępu do zmiennych instancji klasy i jej rodzica. W rzeczywistości można uzyskać do nich dostęp bez przedrostków
super
i
this
, ale tylko wtedy, gdy w bieżącym bloku zmienne te nie pokrywają się z innymi zmiennymi, tj. jeśli nie zawiera zmiennych lokalnych o tych samych nazwach, w przeciwnym razie będziesz musiał używać nazw z przedrostkami, ale to nie ma znaczenia, ponieważ w tej formie są jeszcze bardziej czytelne. Klasycznym przykładem takiego podejścia jest użycie
this
wewnątrz konstruktora, który przyjmuje parametr o tej samej nazwie co zmienna instancji. W dalszej części artykułu dowiemy się, jakie są inne różnice między
super
i
this
i przyjrzymy się kilku przykładom ich użycia.
Jak to i super są podobne
Zanim przyjrzymy się różnicom między słowami kluczowymi
this
i
super
, przyjrzyjmy się niektórym ich podobieństwom:
- Obydwa
this
, i super
są zmiennymi niestatycznymi, więc nie można ich używać w kontekście statycznym, co oznacza, że nie można ich używać w metodzie głównej. Spowoduje to błąd w czasie kompilacji „nie można odwoływać się do zmiennej niestatycznej this
z kontekstu statycznego”. To samo dzieje się, jeśli użyjesz słowa kluczowego w metodzie głównej super
.
- Zarówno
this
, jak i super
mogą być używane wewnątrz konstruktorów do wywoływania innych konstruktorów w łańcuchu, na przykład this
() i super
() wywołują konstruktor bez argumentów odpowiednio klasy dziedziczącej i nadrzędnej.
W poniższym przykładzie najpierw przekazujemy wywołanie bezargumentowego konstruktora klasy B do konstruktora tej samej klasy B, który przyjmuje pojedynczy parametr typu
String
, który z kolei
super("")
wywołuje jednoargumentowy konstruktor z nadklasy.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Wynik: Konstruktor jednoargumentowy klasy A Konstruktor jednoargumentowy klasy B Konstruktor bezargumentowy klasy B
- Wewnątrz konstruktora
this
i super
musi pojawić się nad wszystkimi innymi wyrażeniami na samym początku, w przeciwnym razie kompilator wyświetli komunikat o błędzie. Z tego wynika, że jeden konstruktor nie może zawierać obu this()
, i super()
.
Różnice między super a tym
Teraz wiemy, jak używać słów kluczowych
super
i
this
rozumiemy, dlaczego są potrzebne. Istnieje jednak inna możliwość użycia tych słów kluczowych, o której nie wspomniałem - w klasach Inner, gdzie za ich pomocą bardzo wygodnie jest odwołać się do klasy zewnętrznej za pomocą notacji Outer.
this
dla jego bieżącej instancji i Outer.
super
- dla jego rodzica. Nie zapomnij zastąpić Outer nazwą klasy zewnętrznej. Wymieńmy teraz pokrótce główne różnice pomiędzy słowami kluczowymi
this
i
super
- zmienna
this
odnosi się do bieżącej instancji klasy, w której jest używana, podczas gdy super
odnosi się do bieżącej instancji klasy nadrzędnej.
- Każdy konstruktor, w przypadku braku jawnych wywołań innych konstruktorów, niejawnie wywołuje
super()
konstruktor bezargumentowy swojej klasy nadrzędnej, ale zawsze istnieje możliwość jawnego wywołania dowolnego innego konstruktora za pomocą this()
, lub super()
.
To chyba wszystko, co można powiedzieć o różnicach pomiędzy słowami kluczowymi
this
i
super
w Javie oraz o tym, jak są one używane w programach. Jak widzieliśmy, ich głównym celem jest wywoływanie jednego konstruktora z innego i odwoływanie się do zmiennych instancji zadeklarowanych w bieżącej klasie i jej klasie nadrzędnej. Nie zapominajcie, że nie są to do końca zwykłe zmienne, a teraz - odpowiedź na moje pytanie, które zadałem w pierwszym akapicie. Nie, zmiennej
this
nie można przypisać nowej wartości, ponieważ jest ona uznana za ostateczną. Możesz spróbować to zrobić w IDE - pojawi się błąd kompilacji „nie można przypisać nowej wartości do zmiennej
this
- jest ona uznawana za ostateczną”.
Oryginalny artykuł tutaj .
GO TO FULL VERSION