CodeGym /Java Blogu /Rastgele /Java bu anahtar kelime
John Squirrels
Seviye
San Francisco

Java bu anahtar kelime

grupta yayınlandı
CodeGym'de öğrenciler Java ile bu anahtar kelimeyi kelimenin tam anlamıyla ilk derslerden itibaren tanıştırırlar. Zamanla anlamı netleşir. Ancak geriye dönüp bakıldığında, pek çok kişi muhtemelen uzun bir süre bu anahtar kelimenin Zen'ini anlayamadıklarını kendilerine itiraf edeceklerdir. Bu makale , henüz bunu yapamayanlar için this anahtar kelimesinin sırlarını örten perdeyi aralayacaktır ... Elinizde Schildt'in Java referansı var, sonra 171. sayfada this anahtar kelimesinin olduğunu görebilirsiniz. bir yöntemin onu çağıran nesneye başvurması için gereklidir. Bununla dersi bitirebiliriz. Ama ayrıntılara ihtiyacımız var. Kural olarak, bunu iki durumda kullanmanız gerekir :
  1. Örnek değişken ve yöntem/yapıcı değişkeni aynı ada sahip olduğunda;
  2. Belirli bir kurucu tipini (örneğin, varsayılan bir kurucu veya parametreli bir kurucu) başka bir kurucu türünden çağırmanız gerektiğinde. Buna açık yapıcı çağrısı da denir.
Ve hepsi bu kadar - bu korkunç anahtar kelimenin kullanıldığı sadece iki durum var. Şimdi bu iki durumu örneklerle inceleyelim.

Örnek 1: Bir örnek değişkeni ve yöntem değişkeni aynı ada sahiptir.

Bir isim alanı tanımlayan bir İnsan sınıfımız olduğunu varsayalım : İsim değişkeni için bir ayarlayıcı oluşturalım (ayarlayıcı tamamen işlevseldir - burada bir yakalama yoktur):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
String newName'i setName ayarlayıcı yöntemine ilettiğimizi unutmayın. Yeni bir değişken bildirdik ve onu sadece setName yöntemini çevreleyen kaşlı ayraçlar ({}) içinde görüneceğinden istediğimiz gibi adlandırabilirdik . Ayarlayıcının tek bir satırı olduğunu unutmayın:

name = newName;
Burada newName adında yeni bir değişken tanıttık ve onu nesnenin mevcut name değişkenine atadık. Pek çok programcı, sonuçta aynı şeyden bahsederken, yeni bir isimle bir değişkeni tanıtmayı garip bulabilir. Yani Human sınıfındaki name alanından bahsediyoruz . Bu nedenle Java'nın yaratıcıları, aynı değişken adını uygun bir şekilde kullanmanın bir yolunu bulmuşlardır. Başka bir deyişle, aynı şeyi ifade eden bir değişken için neden iki isim var? Başka bir deyişle, şöyle bir şey yapmak istiyoruz:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Fakat burada bir sorunla karşılaşıyoruz . Artık aynı ada sahip iki değişkenimiz var. Bir String adı Human sınıfına aitken , diğer String adı onun setName yöntemine aittir . Sonuç olarak, ayarlayıcıya aşağıdaki satırı yazarken JVM hangi değişkene başvurduğunuzu bilemez:

name = name;
Java, en yakın ad değişkenini, yani setName yöntemindeki değişkeni kastettiğinizi varsayar : this anahtar kelimesi (örneklerle birlikte) - 3Böylece, yöntemin ad değişkenini basitçe kendisine atadığınız ortaya çıkar. Tabii ki hiçbir anlam ifade etmiyor. Bu nedenle dilin, Human sınıfının name değişkenini setName yöntemindeki name değişkeninden ayırt edecek bir yola ihtiyacı vardı . Bu sorun, bu durumda yöntemdeki değişkene değil, İnsan sınıfının bir örneğiyle ilişkili değişkene başvurmayı düşündüğünüzü belirten this anahtar sözcüğünü ekleyerek çözüldü : Başka bir deyişle, thisthis anahtar kelimesi (örneklerle birlikte) - 4yazının başında da belirttiğimiz gibi çağıran nesneyi ifade eder. Sonuç olarak, setName yöntemi, oluşturulan nesnede kişinin adını ayarlar. Aşağıda, this anahtar sözcüğünü kullanmadan programın kodu verilmiştir . Kod, bir İnsan nesnesi oluşturur ve ona bir ad verir: Ve işte thisthis anahtar kelimesi (örneklerle birlikte) - 5 anahtar sözcüğünü içeren kod :

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);
    }
}
Böylece , aynı şeyi belirtmek için yeni değişkenler eklemekten kaçınarak kodu daha temiz ve fazladan değişkenlerle daha az karmaşık hale getiriyoruz.

Örnek 2: Bunu açık bir yapıcı çağrısı için kullanma

Bir oluşturucuyu diğerinden çağırmak, (garip bir şekilde) birden çok oluşturucunuz olduğunda ve yeni oluşturucunun daha önce farklı bir oluşturucuda yazılmış başlatma kodunu çoğaltmasını istemediğinizde yararlı olabilir. Kafası karışmış? Göründüğü kadar korkutucu değil. Aşağıdaki koda bakın. Human sınıfı için iki kurucusu vardır :

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;
    }
}
Burada ilk önce iki parametreli bir kurucu sağladık: int yaş ve int ağırlık . Diyelim ki iki satır kod var:

this.age = age;
this.weight = weight;
Daha sonra, mevcut yaş ve ağırlık parametrelerine boy ekleyerek üç parametreli başka bir yapıcı eklemeye karar veriyoruz. Yeni kurucuyu şu şekilde yazabilirsiniz:

this.age = age;
this.weight = weight;
this.height = height;
Ancak bu oluşturucudaki mevcut kodu tekrarlamak yerine, this anahtar sözcüğünü kullanarak oluşturucuyu iki parametreyle açıkça çağırabilirsiniz:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
Sanki üç parametreli kurucuya şunu söylüyoruz:
  • iki parametresi olan bu diğer yapıcıyı çağırın
  • ve sonra başka bir değişken ekleyin.
Hepsi bu kadar =). Son olarak, Java'da this anahtar sözcüğünün yalnızca yöntemlerde ve yapıcılarda kullanıldığını not ediyoruz. Ancak bu, tüm statik olmayan yöntemlere dolaylı olarak iletilir (bu nedenle buna genellikle örtük parametre denir) ve yöntemi çağıran nesneye atıfta bulunmak için kullanılabilir. Bu anahtar kelimeden korkmayın çünkü bu korkutucu değil.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION