Java'da “this” in anlamı nedir?


140

Normalde thissadece yapıcılarda kullanıyorum .

Genel değişkenle this.somethingaynı ada sahip parametre değişkenini (kullanarak ) tanımlamak için kullanıldığını anlıyorum .

Ancak, gerçek anlamının thisJava'da ne olduğunu ve thisdot ( .) olmadan kullanırsam ne olacağını bilmiyorum .



2
Yakshemash! Bu yüzden arkadaşlar. Soruma burada da başvurabilirsiniz - stackoverflow.com/questions/23334336/… Chenqui.
Erran Morad

Yanıtlar:


157

this mevcut nesneyi ifade eder.

Statik olmayan her yöntem bir nesne bağlamında çalışır. Eğer böyle bir sınıfınız varsa:

public class MyThisTest {
  private int a;

  public MyThisTest() {
    this(42); // calls the other constructor
  }

  public MyThisTest(int a) {
    this.a = a; // assigns the value of the parameter a to the field of the same name
  }

  public void frobnicate() {
    int a = 1;

    System.out.println(a); // refers to the local variable a
    System.out.println(this.a); // refers to the field a
    System.out.println(this); // refers to this entire object
  }

  public String toString() {
    return "MyThisTest a=" + a; // refers to the field a
  }
}

Sonra çağıran frobnicate()üzerinde new MyThisTest()yazdırılır

1
42
MyThisTest a = 42

Çok etkili bir şekilde birden fazla şey için kullanırsınız:

  • alanla aynı ada sahip başka bir şey olduğunda, bir alan hakkında konuştuğunuzu netleştirin
  • geçerli nesneye bir bütün olarak gönderme
  • kurucunuzda geçerli sınıfın diğer kurucularını çağırır

Bu işe yaramıyor. Bir mainyöntemin gerekli olduğunu söyleyen bir hata alıyorum . Ana yöntemi eklerseniz, oradan aramalıyım. Ve main içindeki frobnicate () öğesini çağırmak için yapılan herhangi bir girişim, statik olmayan bir referanstan statik olmayan bir referans çağıramayacağınızı söyler. Statikten kaldırıldığında main, ana yöntemin bulunmadığı hatayı tekrar verir. Lütfen açıkla.
dbconfession

7
@dbconfession: Buradaki kod bağımsız, kendi kendine çalışan bir program değildir. Sen etmek için yaratılmış okuma kodunu ve metin, çalıştırmak değil! Geçerli bir koddur, ancak yalnızca gösterim amaçlıdır (bu yüzden uygun bir anaya sahip değildir). Ana yöntemle ilgili yardım için lütfen stackoverflow.com/questions/146576/… adresine bakın .
Joachim Sauer

@Joachim Teşekkürler! Bir yöntemi statik hale getirmenin ne anlama geldiği ve nasıl this.çalıştığı hakkında temel bir şey eksik . Benim anlayış olduğunu this.size yürütmesini olmadan denir varolma yöntemin veya değişkenin başka versiyonu için izin sınıfın örneklenmiş sürümüne benzersiz bir yöntem veya değişken olabilmesinin önünü this. adında bir basit olarak Test.classben iki yöntem vardır: public static void main()ve public Test() ben mainstatik olduğu için yöntemler arasında bilgi iletemez ve yapıcılar statik hale getirilemez. Yeni bir soru olarak mı yayınlamalıyım?
dbconfession

@ dbconfession: Sorunuzun başka bir yerde zaten yanıtlandığını hissediyorum, ancak sorunuzun tam olarak ne olduğunu tam olarak kavramıyorum, bu yüzden de gönderebilirsiniz (ancak kopya olarak kapatılmaya hazır olun). Bununla birlikte, en temel düzeyde, bir yöntem yapmak temel olarak, staticonu çağırmak için sınıfın bir örneğine ihtiyacınız olmadığı ve thisiçerisine erişemeyeceğiniz anlamına gelir.
Joachim Sauer

@JoachimSauer Çalıştırmak isteseydim, nasıl yapardım? Dbconfession ile aynı problemim var.
FudgeMuffins

52

Aşağıdaki bir kopyasıdır & yapıştırmak burada , ama çok iyi tüm farklı kullanımlarını açıklar thisanahtar kelime:

Tanım: Java'nın thisanahtar sözcüğü, üzerinde kullanıldığı yöntemin geçerli örneğini belirtmek için kullanılır.

Bunu kullanmanın yolları şunlardır:

  1. Statik veya yerel değişken yerine örnek değişkeninin kullanıldığını özellikle belirtmek için. Yani,

    private String javaFAQ;
    void methodName(String javaFAQ) {
        this.javaFAQ = javaFAQ;
    }

    Burada bu örnek değişkeni ifade eder. Burada yerel değişken için öncelik yüksektir. Bu nedenle, thisyerel değişkeni belirtmez. Parametrenin adı olan yerel değişken örnek değişkeni ile aynı değilse, ne olursa olsun thiskullanılır veya değişmez, örnek değişkeni belirtir.

  2. This kurucuları ifade etmek için kullanılır

     public JavaQuestions(String javapapers) {
         this(javapapers, true);
     }

    Bu, iki parametreye sahip aynı java sınıfının yapıcısını çağırır.

  3. This geçerli java örneğini parametre olarak iletmek için kullanılır

    obj.itIsMe(this);
  4. Yukarıdakine benzer olarak bu, mevcut örneği döndürmek için de kullanılabilir

    CurrentClassName startMethod() {
         return this;
    }

    Not: Bu, yukarıdaki iki noktada iç sınıflarda kullanıldığında istenmeyen sonuçlara yol açabilir. Çünkü bu, dış örneği değil, iç sınıfı ifade eder.

  5. This geçerli sınıfın tanıtıcısını almak için kullanılabilir

    Class className = this.getClass(); // this methodology is preferable in java

    Bu yapılabilir ancak

    Class className = ABC.class; // here ABC refers to the class name and you need to know that!

Her zaman thisolduğu gibi , örneğiyle ilişkilidir ve bu statik yöntemlerle çalışmaz.


44

Tam olmak gerekirse this, dış nesneye atıfta bulunmak için de kullanılabilir

class Outer {
    class Inner {
        void foo() {
            Outer o = Outer.this;
    }
  }
}

5
thisaradığım şey bu! ;)
forresthopkinsa

3
Bu sadecesuper
killjoy

18

Belirli bir nesnenin geçerli örneğini ifade eder, böylece şöyle bir şey yazabilirsiniz

public Object getMe() {
    return this;
}

Yaygın bir kullanım alanı thisgölgelemeyi önlemektir. Aşağıdaki örneği alın:

public class Person {
    private final String name;

    public Person(String name) {
        // how would we initialize the field using parameter?
        // we can't do: name = name;
    }
}

Yukarıdaki örnekte, parametre değerini kullanarak alan üyesini atamak istiyoruz. Aynı adı paylaştıkları için, alan ve parametre arasında bir ayrım yapmamız gerekir. thisalan da dahil olmak üzere bu örneğin üyelerine erişmemizi sağlar.

public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }
}

4
Onu çağırırken uygun stili kullanmaya dikkat edin: o.getMe (). GetMe (). OutOfHere ()
Justin K

8

Swing'de ActionListener, geçerli örneği (yani 'this') uygulayan ve bileşenler için bir ActionListener olarak ekleyen bir sınıf yazmak oldukça yaygındır .

public class MyDialog extends JDialog implements ActionListener
{
    public MyDialog()
    {
        JButton myButton = new JButton("Hello");
        myButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent evt)
    {
        System.out.println("Hurdy Gurdy!");
    }

}

7

Etkin bir şekilde "mevcut bağlamda nesneye yapılan bir referanstır". Örneğin, "bu nesneyi" yazdırmak için şunu yazabilirsiniz:

System.out.println(this);

"Global değişken" kullanımınızın bir şekilde kapalı olduğunu unutmayın ... eğer this.variableNametanım olarak kullanıyorsanız global bir değişken değildir - bu özel örneğe özgü bir değişkendir.


7

Programlamada bir makaleden alıntı yapmak. Kılavuz:


thissahip iki kullanımını bir Java programı.

1. Mevcut nesneye referans olarak

Bu durumda sözdizimi genellikle şuna benzer

this.someVariable = someVariable;

Bu tür kullanım burada açıklanmıştır: 'this' referansı (örneklerle)

2. Farklı bir kurucu çağırmak

Bu durumda sözdizimi genellikle şuna benzer

MyClass() {
    this(DEFAULT_VALUE); // delegate to other constructor
}

MyClass(int value) {
    // ...
}

Bu tür kullanım burada açıklanmaktadır: bu (…) yapıcı çağrısı (örneklerle)


4

Yöntemin çağrıldığı örneği ifade eder

class A {

  public boolean is(Object o) {
    return o == this;
  }

}

A someA = new A();
A anotherA = new A();
someA.is(someA); // returns true
someA.is(anotherA); // returns false

4

Bu Kelime (böylece standart JAVA Kodunu beklemeyin, sadece exampple) kodunun altına düşünün örneğin, bir bloğun geçerli değişken başvurmak için kullanılır:

Public class test{

test(int a) {
this.a=a;
}

Void print(){
System.out.println(a);
}

   Public static void main(String args[]){
    test s=new test(2);
    s.print();
 }
}

Bu kadar. Çıktı "2" olacaktır. Biz değil kullandıysanız bu anahtar kelime, daha sonra çıkış olacaktır: 0


3

Nesnelerin, thisayrılmış sözcüklerin kullanıldığı belirli bir nesneye hangi yöntem ve değişkenlerin ait olduğunu belirtmek için sınıflardan türetilen yöntemleri ve öznitelikleri (değişkenleri) vardır . örnek değişkenler söz konusu olduğunda, örtük ve açık parametreler arasındaki farkı anlamak önemlidir. Nesne fillTankçağrısına bir göz atın audi.

Car audi= new Car();

audi.fillTank(5); // 5 is the explicit parameter and the car object is the implicit parameter 

Parantez içindeki değer örtük parametredir ve nesnenin kendisi açık parametredir, açık parametrelere sahip olmayan yöntemler, örtük parametreler kullanır, fillTankyöntemin hem açık hem de örtük bir parametresi vardır.

Sınıftaki fillTankyönteme daha yakından bakalımCar

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

   public void fillTank(double gallons)
   {
      tank = tank + gallons;
   }

}

Bu sınıfta bir örnek değişken "tank" var. Tank örneği değişkenini kullanan birçok nesne olabilir, belirli bir nesne için "tank" örnek değişkeninin kullanıldığını belirtmek için, daha önce oluşturduğumuz "audi" nesnesinde, thisayrılmış anahtar kelimeyi kullanırız. için örnek değişkenleri bir 'Bu' kullanılması yöntemine örnek değişkeni, "Tank" bizim durumumuzda, örtük parametrenin örneği değişken olduğunu gösterir.

Java derleyici, thisayrılmış sözcüğü otomatik olarak ekler, böylece eklemeniz gerekmez, bu bir tercih meselesidir. thisNokta (.) Olmadan kullanamazsınız çünkü bunlar java (sözdizimi) kurallarıdır.

Özetle.

  • Nesneler sınıflar tarafından tanımlanır ve yöntem ve değişkenlere sahiptir
  • Kullanımı this, bir de , örneğin değişken bir bölgesi bir yöntem , örneğin, değişken örtülü parametreye ait belirtir, ya da örtülü parametrenin bir örneği değişken olduğunu.
  • Örtük parametre, yöntemin bu durumda "audi" olarak çağrıldığı nesnedir.
  • Java derleyicisi bu ayrılmış kelimeyi otomatik olarak ekler, ekleyerek bir tercih meselesidir
  • this nokta (.) olmadan kullanılamaz, sözdizimsel olarak geçersizdir
  • this yerel değişkenler ile aynı ada sahip genel değişkenler arasında ayrım yapmak için de kullanılabilir
  • thisRezerv kelime de bir yöntem olup belirli bir nesneye ait göstermek için yöntemler için de geçerlidir.

2

Örnek değişkenleri, oluşturduğunuz her nesne için ortaktır. diyelim ki iki örnek değişkeni var

class ExpThisKeyWord{
int x;
int y;

public void setMyInstanceValues(int a, int b) {
    x= a;
    y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}

}




class Demo{
public static void main(String[] args){

ExpThisKeyWord obj1 = new ExpThisKeyWord();
ExpThisKeyWord obj2 = new ExpThisKeyWord();
ExpThisKeyWord obj3 = new ExpThisKeyWord();

obj1.setMyInstanceValues(1, 2);
obj2.setMyInstanceValues(11, 22);
obj3.setMyInstanceValues(111, 222);



}
}

yukarıdaki kodu fark ederseniz, üç nesne başlattık ve üç nesne SetMyInstanceValues ​​yöntemini çağırıyor. Sizce JVM her nesne için değerleri doğru şekilde atar mı? hile var, JVM yukarıda nasıl gösterildiğini bu kodu görmeyecek. bunun yerine, aşağıdaki kod gibi görecektir;

public void setMyInstanceValues(int a, int b) {
    this.x= a; //Answer: this keyword denotes the current object that is handled by JVM.
    this.y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}

2

(Geç olduğunu biliyorum ama beni hiç görmediğin sinsi boi oldum)

Bu en Nesne yönelimli programlama dillerinde kelime değil tüm araçlar ise bu sınıfın geçerli nesne örneği yönelik bir başvuru. Esasen, bu nesneyi yöntemin dışından adıyla çağırmakla aynı şeydir. Muhtemelen hiçbir anlam ifade etmiyordu, bu yüzden ayrıntılı bir şekilde:

Sınıfın dışında, nesnenin o örneğindeki bir şeyi çağırmak için, örneğin, nesne adı verilen bir nesneniz olduğunu ve kullanmanız gereken bir alan elde etmek istediğinizi varsayalım

object.field

Diyelim ki, örneğin kurucunuz , sınıfınızın içinden object.field'a erişmeye çalışıyorsunuz.

this.field

Bu anahtar kelime esasen iç sınıfın çağrılan nesne adı anahtar kelime yerine geçer. Genellikle bunu yapmak için çok fazla bir neden yoktur, biri aynı sınıftan biri diğeri sınıfın alanı diğeri ise sadece bir yöntemin içinde değişken olan iki değişkeniniz varsa, ikisi arasında deşifre etmeye yardımcı olur. . Örneğin, eğer buna sahipseniz: (Hah, anladınız mı? Bu ? Hehe .... sadece ben? Tamam :( Şimdi gideceğim)

public String Name;
//Constructor for {object} class
public object(String Name){
    Name = Name;
}

Bu, bazı sorunlara neden olur, derleyici, yapıcı için parametrelerde tanımlanan Name değişkeni ile sınıfınızın alan bildirimlerinin içindeki Name değişkeni arasındaki farkı bilemez, böylece bunun yerine Name parametresini atar. .. yararlı bir şey yapmayan ve kelimenin tam anlamıyla bir amacı olmayan Name parametresinin değeri. Bu, çoğu yeni programın yaptığı yaygın bir konudur ve ben de kurban oldum. Her neyse, bu parametreyi tanımlamanın doğru yolu kullanmak olacaktır:

public String Name;
//Constructor for {object} class
public object(String Name){
    this.Name = Name;
}

Bu şekilde, derleyici, atamaya çalıştığınız Name değişkeninin, yöntemin bir parçası değil, sınıfın bir parçası olduğunu bilir ve doğru bir şekilde atar; yani, yapıcıya koyduğunuz her şeye Ad alanını atar.

Özetlemek gerekirse, temelde üzerinde çalıştığınız sınıfın nesne örneğinin bir alanına başvurur, bu nedenle bu nesne veya bu örnek anlamına gelen "this" anahtar sözcüğüdür. Derleyicinin üzerinde çalıştığı için bulmak zor olan olası hataları önlemek için sadece adı kullanmak yerine sınıfınızın bir alanını çağırırken bunu kullanmak için iyi bir uygulamadır.




1

bu, bazı yöntemlerin veya yapıcıların içinde kullanılabilir.

Geçerli nesneye başvuruyu döndürür.


1

Bu, şu anda “bulunduğunuz” nesneyi ifade eder. Başka bir deyişle, bu alıcı nesneye karşılık gelir. Hangi değişkenden bahsettiğinizi netleştirmek için bunu kullanırsınız. Java_whitepaper sayfası: 37

class Point extends Object
{
    public double x;
    public double y;

    Point()
    {
        x = 0.0;
        y = 0.0;
    }

    Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }
}

Yukarıdaki örnek kodda this.x / this.y, Point sınıfı x ve y değişkenleri olan geçerli sınıfı ifade eder; burada (çift x, çift y), geçerli sınıfa değer atamak için farklı sınıftan geçirilen çift değerlerdir.


0

Aynı cevabı arıyordum ve bir şekilde kavramı net bir şekilde anlayamadım. Ama sonunda bunu bu bağlantıdan anladım

bu Java'daki bir anahtar kelimedir. Hangi sınıf yöntemi veya yapıcı içinde kullanılabilir. (This) yöntemi veya yapıcısı çağrılan geçerli bir nesneye başvuru olarak çalışır. bu anahtar kelime, bir örnek yönteminden veya bir yapıcıdan geçerli nesnenin herhangi bir üyesine başvurmak için kullanılabilir.

Net bir anlayış için bağlantıdaki örneklere bakın


mükemmel bir örnek
sathya

0

Örnek değişkenleri yapıcıda bildirilen değişkenlerle aynıysa, veri atamak için "this" kullanırız.

class Example{
     int assign;// instance variable

     Example(int assign){ // variable inside constructor
          this.assign=assign;
     }
}

Bu yardımcı olur umarım.


0

Java'da "this" önceden tanımlanmış bir değişkendir. Bu yöntemde "this" kullanırsak, o anda çalışan nesnenin referansını (adresini) alırız. Örnek olarak.

şu anda çalışan nesnenin this.age ---> yaşı.


0

Bu anahtar kelimeden anladığımı paylaşmak istiyorum. Bu anahtar kelime java'da aşağıdaki gibi 6 kullanıma sahiptir: -

1. Mevcut sınıf değişkenine atıfta bulunmak için kullanılabilir. Bir kod ile anlayalım. *

Bu anahtar kelimeyi aşağıda verilen örnekle kullanmazsak sorunu anlayalım:

class Employee{  
int id_no;  
String name;  
float salary;  
Student(int id_no,String name,float salary){  
id_no = id_no;  
name=name;  
salary = salary;  
}  
void display(){System.out.println(id_no +" "+name+" "+ salary);}  
}  
class TestThis1{  
public static void main(String args[]){  
Employee s1=new Employee(111,"ankit",5000f);  
Employee s2=new Employee(112,"sumit",6000f);  
s1.display();  
s2.display();  
}}  

Çıktı:-

0 null 0.0
0 null 0.0

Yukarıdaki örnekte, parametreler (resmi bağımsız değişkenler) ve örnek değişkenler aynıdır. Bu nedenle, yerel değişkeni ve örnek değişkeni ayırt etmek için bu anahtar kelimeyi kullanıyoruz.

class Employee{  
int id_no;  
String name;  
float salary;  
Student(int id_no,String name,float salary){  
this.id_no = id_no;  
this.name=name;  
this.salary = salary;  
}  
void display(){System.out.println(id_no +" "+name+" "+ salary);}  
}  
class TestThis1{  
public static void main(String args[]){  
Employee s1=new Employee(111,"ankit",5000f);  
Employee s2=new Employee(112,"sumit",6000f);  
s1.display();  
s2.display();  
}} 

çıktı:

111 ankit 5000
112 sumit 6000

2. Geçerli sınıf yöntemini çağırmak.

class A{  
void m(){System.out.println("hello Mandy");}  
void n(){  
System.out.println("hello Natasha");  
//m();//same as this.m()  
this.m();  
}  
}  
class TestThis4{  
public static void main(String args[]){  
A a=new A();  
a.n();  
}}  

Çıktı:

hello Natasha
hello Mandy

3. geçerli sınıf yapıcısını çağırmak. Zincirleme yapımında kullanılır.

class A{  
A(){System.out.println("hello ABCD");}  
A(int x){  
this();  
System.out.println(x);  
}  
}  
class TestThis5{  
public static void main(String args[]){  
A a=new A(10);  
}}

Çıktı:

hello ABCD
10

4. yöntemde argüman olarak geçmek.

class S2{  
  void m(S2 obj){  
  System.out.println("The method is invoked");  
  }  
  void p(){  
  m(this);  
  }  
  public static void main(String args[]){  
  S2 s1 = new S2();  
  s1.p();  
  }  
}  

Çıktı:

The method is invoked

5. yapıcı çağrısında argüman olarak geçmek

class B{  
  A4 obj;  
  B(A4 obj){  
    this.obj=obj;  
  }  
  void display(){  
    System.out.println(obj.data);//using data member of A4 class  
  }  
}  

class A4{  
  int data=10;  
  A4(){  
   B b=new B(this);  
   b.display();  
  }  
  public static void main(String args[]){  
   A4 a=new A4();  
  }  
} 

Çıktı:-

10

6. geçerli sınıf örneğini döndürmek için

class A{  
A getA(){  
return this;  
}  
void msg(){System.out.println("Hello");}  
}  
class Test1{  
public static void main(String args[]){  
new A().getA().msg();  
}  
}  

Çıktı:-

Hello

Ayrıca, bu anahtar kelime sözdizimi geçersiz olduğu için. (Dot) olmadan kullanılamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.