CodeGym /Java Blog /Willekeurig /Java dit trefwoord
John Squirrels
Niveau 41
San Francisco

Java dit trefwoord

Gepubliceerd in de groep Willekeurig
Op CodeGym maken leerlingen letterlijk vanaf de eerste lessen kennis met het Java-woord dit sleutelwoord. Na verloop van tijd wordt de betekenis duidelijk. Maar terugkijkend zullen veel mensen waarschijnlijk bij zichzelf toegeven dat ze de zen van dit sleutelwoord lange tijd niet konden begrijpen. Dit artikel zal het gordijn opzij trekken en de geheimen van het this- trefwoord verbergen voor iedereen die dit nog niet heeft kunnen doen... Ik heb de Java-referentie van Schildt , en op pagina 171 kun je zien dat het this- trefwoord is vereist voor een methode om te verwijzen naar het object dat het heeft aangeroepen. Daar zouden we de les mee kunnen afsluiten. Maar we hebben bijzonderheden nodig. In de regel moet u dit in twee gevallen gebruiken:
  1. Wanneer een instantievariabele en methode/constructorvariabele dezelfde naam hebben;
  2. Wanneer u een specifiek type constructor moet aanroepen (bijvoorbeeld een standaardconstructor of geparametriseerde constructor) vanaf een ander type constructor. Dit wordt ook wel een expliciete constructoraanroep genoemd.
En dat is het zo'n beetje - er zijn slechts twee gevallen waarin dit beangstigende zoekwoord wordt gebruikt. Laten we nu eens kijken naar deze twee gevallen in voorbeelden.

Voorbeeld 1: Een instantievariabele en methodevariabele hebben dezelfde naam.

Stel dat we een Human- klasse hebben die een naamveld definieert: laten we een setter maken voor de naamvariabele (de setter is volledig functioneel - er zit hier geen addertje onder het gras):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
Merk op dat we String newName doorgeven aan de setName setter-methode. We hebben een nieuwe variabele gedeclareerd en hadden deze elke gewenste naam kunnen geven, omdat deze alleen zichtbaar zal zijn binnen de accolades ({}) die de setName- methode omsluiten. Merk op dat de setter een enkele regel heeft:

name = newName;
Hier hebben we een nieuwe variabele met de naam newName geïntroduceerd en deze toegewezen aan de bestaande naamvariabele van het object . Veel programmeurs vinden het misschien vreemd om een ​​variabele met een nieuwe naam te introduceren terwijl we het uiteindelijk over hetzelfde hebben. Dat wil zeggen, we hebben het over het naamveld in de klasse Human . Daarom bedachten de makers van Java een manier om gemakkelijk dezelfde variabelenaam te gebruiken. Met andere woorden, waarom twee namen hebben voor een variabele die hetzelfde aanduiden. Met andere woorden, we willen iets als dit doen:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Maar hier stuiten we op een probleem . We hebben nu twee variabelen met dezelfde naam. De ene String-naam behoort tot de klasse Human , terwijl de andere String-naam tot de setName -methode behoort . Als gevolg hiervan zou de JVM niet weten naar welke variabele u verwijst wanneer u de volgende regel in de setter schrijft:

name = name;
Java gaat ervan uit dat je de dichtstbijzijnde naamvariabele bedoelt , dwz die van de methode setName : Het trefwoord dit (met voorbeelden) - 3het blijkt dus dat je de naamvariabele van de methode gewoon aan zichzelf toewijst. Wat natuurlijk nergens op slaat. Daarom had de taal een manier nodig om de naamvariabele van de klasse Human te onderscheiden van de naamvariabele in de methode setName . Dit probleem is opgelost door het sleutelwoord this te introduceren , wat in dit geval aangeeft dat u van plan bent te verwijzen naar de variabele die is gekoppeld aan een instantie van de Human- klasse, niet naar de variabele in de methode: Met andere woorden, thisHet trefwoord dit (met voorbeelden) - 4verwijst naar het aanroepende object, zoals we aan het begin van het artikel vermeldden. Als gevolg hiervan stelt de methode setName de naam van de persoon in op het gemaakte object. Hieronder staat de code van het programma zonder het trefwoord this te gebruiken . De code maakt een menselijk object en kent er een naam aan toe: Het trefwoord dit (met voorbeelden) - 5En hier is de code met het trefwoord 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);
    }
}
Hierdoor kunnen we voorkomen dat nieuwe variabelen worden geïntroduceerd om hetzelfde aan te duiden, waardoor de code schoner wordt en minder vol zit met extra variabelen .

Voorbeeld 2: dit gebruiken voor een expliciete constructoraanroep

Het aanroepen van de ene constructor vanuit de andere kan handig zijn als je (vreemd genoeg) meerdere constructors hebt en je niet wilt dat de nieuwe constructor de initialisatiecode dupliceert die eerder in een andere constructor is geschreven. Verward? Het is niet zo eng als het lijkt. Kijk naar de code hieronder. Het heeft twee constructors voor de klasse 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;
    }
}
Hier hebben we eerst een constructor voorzien van twee parameters: int age en int weight . Stel dat het twee regels code heeft:

this.age = age;
this.weight = weight;
Later besluiten we om nog een constructor toe te voegen met drie parameters, waarbij lengte wordt toegevoegd aan de bestaande parameters voor leeftijd en gewicht. Je zou de nieuwe constructor als volgt kunnen schrijven:

this.age = age;
this.weight = weight;
this.height = height;
Maar in plaats van bestaande code in deze constructor te herhalen, kunt u het trefwoord this gebruiken om de constructor expliciet aan te roepen met twee parameters:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
Het is alsof we tegen de constructor met drie parameters zeggen:
  • noem deze andere constructor die twee parameters heeft
  • en voeg dan nog een variabele toe.
Dat is alles =). Ten slotte merken we op dat in Java het trefwoord this alleen wordt gebruikt in methoden en constructors. Maar dit wordt impliciet doorgegeven aan alle niet-statische methoden (daarom wordt dit vaak een impliciete parameter genoemd) en kan worden gebruikt om te verwijzen naar het object dat de methode heeft aangeroepen. Wees niet bang voor dit zoekwoord, want dit is niet eng.
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION