CodeGym /Blog Java /Random-PL /Java to słowo kluczowe
Autor
Jesse Haniel
Lead Software Architect at Tribunal de Justiça da Paraíba

Java to słowo kluczowe

Opublikowano w grupie Random-PL
Na CodeGym uczniowie są zapoznawani z Javą to słowo kluczowe dosłownie od pierwszych lekcji. Z czasem jego znaczenie staje się jasne. Ale patrząc wstecz, wielu ludzi prawdopodobnie przyznaje przed sobą, że przez długi czas nie mogli zrozumieć zen tego słowa kluczowego. Ten artykuł uchyli kurtynę zakrywającą tajemnice słowa kluczowego this dla każdego, kto jeszcze nie był w stanie tego zrobić... Mam odniesienie Schildta do Javy , a na stronie 171 możesz zobaczyć, że słowo kluczowe this jest wymagane, aby metoda odwoływała się do obiektu, który ją wywołał. Na tym moglibyśmy zakończyć lekcję. Ale potrzebujemy konkretów. Z reguły musisz użyć tego w dwóch przypadkach:
  1. Gdy zmienna instancji i zmienna metody/konstruktora mają tę samą nazwę;
  2. Gdy trzeba wywołać określony typ konstruktora (na przykład konstruktor domyślny lub konstruktor sparametryzowany) z innego typu konstruktora. Jest to również nazywane jawnym wywołaniem konstruktora.
I to wszystko — są tylko dwa przypadki użycia tego przerażającego słowa kluczowego. Teraz spójrzmy na te dwa przypadki na przykładach.

Przykład 1: Zmienna instancji i zmienna metody mają tę samą nazwę.

Załóżmy, że mamy klasę Human , która definiuje pole name: Stwórzmy setter dla zmiennej name (setter jest w pełni funkcjonalny — nie ma tu żadnego haczyka):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
Zauważ, że przekazujemy String newName do metody ustawiającej setName Zadeklarowaliśmy nową zmienną i mogliśmy nadać jej dowolną nazwę, ponieważ będzie ona widoczna tylko w nawiasach klamrowych ({}) otaczających metodę setName . Zauważ, że seter ma jedną linię:

name = newName;
Tutaj wprowadziliśmy nową zmienną o nazwie newName i przypisaliśmy ją do istniejącej zmiennej nazwy obiektu . Wielu programistom może wydawać się dziwne wprowadzanie zmiennej z nową nazwą, kiedy ostatecznie mówimy o tym samym. Oznacza to, że mówimy o polu nazwy w klasie Człowiek . Dlatego twórcy Javy wymyślili sposób na wygodne używanie tej samej nazwy zmiennej. Innymi słowy, po co mieć dwie nazwy dla zmiennej oznaczającej to samo. Innymi słowy, chcemy zrobić coś takiego:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Ale tutaj napotykamy problem . Mamy teraz dwie zmienne o tej samej nazwie. Jedna nazwa String należy do klasy Human , podczas gdy druga nazwa String należy do jej metody setName . W rezultacie JVM nie wiedziałby, do której zmiennej się odwołujesz, pisząc następujący wiersz w seterze:

name = name;
Java zakłada, że ​​masz na myśli najbliższą zmienną name , tj. tę z metody setName : Słowo kluczowe this (z przykładami) - 3Okazuje się więc, że po prostu przypisujesz sobie zmienną name metody. Co oczywiście nie ma żadnego sensu. Dlatego język potrzebował jakiegoś sposobu na odróżnienie zmiennej name klasy Human od zmiennej name w metodzie setName . Ten problem został rozwiązany przez wprowadzenie słowa kluczowego this , które w tym przypadku wskazuje, że zamierzasz odwoływać się do zmiennej powiązanej z instancją klasy Human , a nie do zmiennej w metodzie: Innymi słowy, thisSłowo kluczowe this (z przykładami) - 4odnosi się do obiektu wywołującego, jak wspomnieliśmy na początku artykułu. W rezultacie metoda setName ustawia imię osoby na tworzonym obiekcie. Poniżej znajduje się kod programu bez użycia słowa kluczowego this . Kod tworzy obiekt Human i przypisuje mu nazwę: Słowo kluczowe this (z przykładami) - 5Oto kod ze słowem kluczowym this :

public class Solution {
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Vinny");
        human1.print();
    }
}
class Human {
    String name;
    public String getName() {
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    void print() {
        System.out.println(name);
    }
}
W ten sposób pozwala nam to uniknąć wprowadzania nowych zmiennych oznaczających to samo, dzięki czemu kod jest czystszy i mniej zaśmiecony dodatkowymi zmiennymi.

Przykład 2: Użycie tego do jawnego wywołania konstruktora

Wywoływanie jednego konstruktora z innego może być przydatne, gdy masz (co dziwne) wiele konstruktorów i nie chcesz, aby nowy konstruktor duplikował kod inicjalizacyjny napisany wcześniej w innym konstruktorze. Zdezorientowany? To nie jest takie straszne, jak się wydaje. Spójrz na poniższy kod. Posiada dwa konstruktory dla klasy Human :

class Human {
    int age;
    int weight;
    int height;

    Human(int age, int weight) {
        this.age = age;
        this.weight = weight;
    }
    Human(int age, int weight, int height) {
        // Call the constructor with two parameters
        this(age, weight);
        // and then initialize the missing variable
        this.height = height;
    }
}
Tutaj najpierw udostępniliśmy konstruktorowi dwa parametry: int age i int weight . Załóżmy, że ma dwie linie kodu:

this.age = age;
this.weight = weight;
Później decydujemy się na dodanie kolejnego konstruktora z trzema parametrami, dodając wzrost do istniejących parametrów wieku i wagi. Możesz napisać nowego konstruktora w ten sposób:

this.age = age;
this.weight = weight;
this.height = height;
Ale zamiast powtarzać istniejący kod w tym konstruktorze, możesz użyć słowa kluczowego this , aby jawnie wywołać konstruktora z dwoma parametrami:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
To tak, jakbyśmy mówili do konstruktora z trzema parametrami:
  • wywołaj tego innego konstruktora, który ma dwa parametry
  • a następnie dodaj kolejną zmienną.
To wszystko =). Na koniec zauważmy, że w Javie słowo kluczowe this jest używane tylko w metodach i konstruktorach. Ale jest to przekazywane niejawnie do wszystkich metod niestatycznych (dlatego jest to często nazywane parametrem niejawnym) i może być użyte w odniesieniu do obiektu, który wywołał metodę. Nie bój się tego słowa kluczowego, ponieważ to nie jest straszne.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION