JavaRush /Blog Java /Random-PL /Różnica między tym a super słowami kluczowymi w Javie
grishin
Poziom 27
Харьков

Różnica między tym a super słowami kluczowymi w Javie

Opublikowano w grupie Random-PL
thisi supersą 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 , thisbrzmi super: i Czy można przypisać inne znaczenie słowu kluczowemu thisw Javie? i jaka jest różnica między słowami kluczowymi thisa superw Javie. Nie wiem? Cóż, nie podam tutaj odpowiedzi – znajdziesz ją na końcu artykułu. Różnica między tym a super słowami kluczowymi w Javie - 1Tak więc, jak powiedziałem na początku, główna różnica między thisi superw Javie polega na tym, że thisbieżąca instancja klasy reprezentuje, podczas gdy superbieżąca instancja klasy nadrzędnej reprezentuje. Oto jeden z przykładów wykorzystania zmiennych thisoraz 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 thisi 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 thiszastosowania super. Również w thisJavie supersą 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 superi 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 thiswewną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 superi thisi przyjrzymy się kilku przykładom ich użycia.

Jak to i super są podobne

Zanim przyjrzymy się różnicom między słowami kluczowymi thisi super, przyjrzyjmy się niektórym ich podobieństwom:
  1. Obydwa this, i supersą 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 thisz kontekstu statycznego”. To samo dzieje się, jeśli użyjesz słowa kluczowego w metodzie głównej super.

  2. Zarówno this, jak i supermogą 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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        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
  1. Wewnątrz konstruktora thisi supermusi 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 superi thisrozumiemy, 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. thisdla 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 thisisuper
  1. zmienna thisodnosi się do bieżącej instancji klasy, w której jest używana, podczas gdy superodnosi się do bieżącej instancji klasy nadrzędnej.

  2. 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 thisi superw 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 thisnie 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 .
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION