CodeGym /Java блог /Случаен /Java тази ключова дума
John Squirrels
Ниво
San Francisco

Java тази ключова дума

Публикувано в групата
В CodeGym учениците се запознават с Java тази ключова дума буквално от първите уроци. С времето meaningто му става ясно. Но поглеждайки назад, много хора вероятно признават пред себе си, че дълго време не са могли да разберат Дзен на тази ключова дума. Тази статия ще дръпне завесата, покриваща тайните на ключовата дума this за всеки, който все още не е успял да го направи... Имам препратка към Java на Schildt , тогава на page 171 можете да видите, че ключовата дума this се изисква, за да може методът да препраща към обекта, който го е извикал. Можем да завършим урока с това. Но имаме нужда от конкретика. Като правило трябва да използвате това в два случая:
  1. Когато променлива на екземпляр и променлива на метод/конструктор имат едно и също име;
  2. Когато трябва да извикате конкретен тип конструктор (например конструктор по подразбиране or параметризиран конструктор) от друг тип конструктор. Това също се нарича изрично извикване на конструктор.
И това е всичко – има само два случая, в които се използва тази страшна ключова дума. Сега нека разгледаме тези два случая в примери.

Пример 1: Променлива на екземпляр и променлива на метод имат едно и също име.

Да предположим, че имаме клас Human , който дефинира поле за име: Нека създадем сетер за променливата име (сетерът е напълно функционален — тук няма уловка):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
Обърнете внимание, че предаваме String newName на метода за настройка на setName Декларирахме нова променлива и можехме да я наименуваме Howто искаме, защото ще бъде видима само във фигурните скоби ({}), които ограждат метода setName . Имайте предвид, че сетерът има един ред:

name = newName;
Тук въведохме нова променлива, наречена newName , и я присвоихме на съществуващата променлива за име на обекта . Много програмисти може да сметнат за странно въвеждането на променлива с ново име, когато в крайна сметка говорим за едно и също нещо. Тоест, говорим за полето за име в класа Human . Ето защо създателите на Java измислиха начин за удобно използване на едно и също име на променлива. С други думи, защо да имаме две имена за променлива, обозначаваща едно и също нещо. С други думи, искаме да направим нещо подобно:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Но тук се натъкваме на проблем . Сега имаме две променливи с едно и също име. Едното име на String принадлежи на класа Human , докато другото име на String принадлежи на неговия метод setName . В резултат на това JVM няма да знае коя променлива имате предвид, когато пишете следния ред в сетера:

name = name;
Java предполага, че имате предвид най-близката променлива за име , т.е. тази от метода setName : Тази ключова дума (с примери) - 3Така се оказва, че вие ​​просто присвоявате променливата за име на метода на себе си. Което разбира се няма ниHowъв смисъл. Следователно езикът се нуждаеше от няHowъв начин за разграничаване на променливата на името на класа Human от променливата на името в метода setName . Този проблем беше решен чрез въвеждане на ключовата дума this , която в този случай показва, че възнамерявате да препратите към променливата, свързана с екземпляр на класа Human , а не към променливата в метода: С други думи, товаТази ключова дума (с примери) - 4се отнася до извикващия обект, Howто споменахме в началото на статията. В резултат на това методът setName задава името на лицето върху създадения обект. По-долу е codeът на програмата, без да се използва тази ключова дума. Кодът създава човешки обект и му присвоява име: Тази ключова дума (с примери) - 5И ето codeа с ключовата дума 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);
    }
}
По този начин това ни позволява да избегнем въвеждането на нови променливи за обозначаване на едно и също нещо, което прави codeа по-чист и по-малко претрупан с допълнителни променливи.

Пример 2: Използване на това за явно извикване на конструктор

Извикването на един конструктор от друг може да бъде полезно, когато имате (достатъчно странно) множество конструктори и не искате новият конструктор да дублира codeа за инициализация, написан преди това в различен конструктор. объркани? Не е толкова страшно, колкото изглежда. Вижте codeа по-долу. Има два конструктора за класа 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;
    }
}
Тук първо предоставихме конструктор с два параметъра: int age и int weight . Да предположим, че има два реда code:

this.age = age;
this.weight = weight;
По-късно решаваме да добавим още един конструктор с три параметъра, добавяйки височина към съществуващите параметри за възраст и тегло. Можете да напишете новия конструктор така:

this.age = age;
this.weight = weight;
this.height = height;
Но instead of да повтаряте съществуващ code в този конструктор, можете да използвате ключовата дума this , за да извикате изрично конструктора с два параметъра:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
Все едно казваме на конструктора с три параметъра:
  • извикайте този друг конструктор, който има два параметъра
  • и след това добавете друга променлива.
Това е всичко =). И накрая, отбелязваме, че в Java ключовата дума this се използва само в методи и конструктори. Но това се предава имплицитно на всички нестатични методи (ето защо това често се нарича имплицитен параметър) и може да се използва за препратка към обекта, който е извикал метода. Не се плашете от тази ключова дума, защото това не е страшно.
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION