Apa arti "ini" di Jawa?


140

Biasanya, saya menggunakan thiskonstruktor saja.

Saya mengerti bahwa ini digunakan untuk mengidentifikasi variabel parameter (dengan menggunakan this.something), jika memiliki nama yang sama dengan variabel global.

Namun, saya tidak tahu bahwa apa arti sebenarnya dari thisJava dan apa yang akan terjadi jika saya menggunakan thistanpa dot ( .).



2
Yakshemash! Jadi teman. Anda mungkin ingin merujuk pertanyaan saya di sini juga - stackoverflow.com/questions/23334336/... Chenqui.
Erran Morad

Jawaban:


157

this mengacu pada objek saat ini.

Setiap metode non-statis berjalan dalam konteks objek. Jadi jika Anda memiliki kelas seperti ini:

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
  }
}

Kemudian memanggil frobnicate()pada new MyThisTest()akan mencetak

1
42
MyThisTest a = 42

Jadi, Anda menggunakannya secara efektif untuk banyak hal:

  • mengklarifikasi bahwa Anda berbicara tentang bidang, ketika ada juga hal lain dengan nama yang sama dengan bidang
  • lihat objek saat ini secara keseluruhan
  • aktifkan konstruktor lain dari kelas saat ini di konstruktor Anda

Ini tidak berfungsi. Saya mendapatkan pesan kesalahan yang mengatakan bahwa mainmetode diperlukan. Jika saya menambahkan metode utama, maka saya harus menelepon dari sana. Dan setiap upaya untuk memanggil frobnicate () di dalam main mengatakan bahwa Anda tidak dapat memanggil referensi non-statis dari dalam yang statis. Dan menghapus statis dari mainmengembalikan kesalahan lagi bahwa tidak ada metode utama yang ditemukan. Tolong jelaskan.
dbconfession

7
@dbconfession: kode di sini tidak dimaksudkan sebagai program mandiri yang berjalan sendiri. Anda dimaksudkan untuk membaca dengan kode dan teks, tidak menjalankannya! Ini adalah kode yang valid, tetapi ini hanya dimaksudkan untuk tujuan demonstrasi (itu sebabnya tidak memiliki utama yang tepat). Untuk bantuan dengan metode utama, silakan lihat stackoverflow.com/questions/146576/… .
Joachim Sauer

@ Joachim, terima kasih! Saya melewatkan sesuatu yang mendasar tentang apa artinya membuat metode statis dan cara this.kerjanya. Pemahaman saya adalah yang this.memungkinkan Anda untuk memanggil metode atau variabel yang unik untuk versi instantiated kelas, memungkinkan untuk versi lain dari metode atau variabel yang ada yang dipanggil tanpa memohon this. Dalam sederhana disebut Test.classsaya punya dua metode: public static void main()dan public Test() saya tidak dapat meneruskan informasi antara metode karena mainstatis dan konstruktor tidak dapat dibuat statis. Haruskah saya memposting sebagai pertanyaan baru?
dbconfession

@ dbconfession: Saya merasa pertanyaan Anda sudah dijawab di tempat lain, tetapi saya tidak begitu mengerti apa sebenarnya pertanyaan Anda, jadi Anda sebaiknya mempostingnya (tetapi bersiaplah untuk menutupnya sebagai duplikat). Namun, pada tingkat yang paling mendasar, membuat metode staticpada dasarnya berarti bahwa Anda tidak memerlukan turunan kelas untuk memanggilnya dan bahwa Anda tidak akan memiliki akses ke thisdalamnya.
Joachim Sauer

@ JoachimSauer Jika saya ingin menjalankannya, bagaimana saya? Saya punya masalah yang sama dengan dbconfession.
FudgeMuffins

52

Berikut ini adalah copy & paste dari sini , tetapi menjelaskan dengan sangat baik semua penggunaan thiskata kunci yang berbeda:

Definisi: Kata kunci Java thisdigunakan untuk merujuk contoh saat ini dari metode yang digunakannya.

Berikut ini adalah cara untuk menggunakan ini:

  1. Untuk secara spesifik menyatakan bahwa variabel instance digunakan sebagai pengganti variabel statis atau lokal. Itu adalah,

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

    Di sini ini merujuk pada variabel instan. Di sini prioritasnya tinggi untuk variabel lokal. Oleh karena itu tidak adanya thismenunjukkan variabel lokal. Jika variabel lokal yang nama parameternya tidak sama dengan variabel instan maka terlepas dari thisdigunakan atau tidak itu menandakan variabel instan.

  2. This digunakan untuk merujuk konstruktor

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

    Ini memanggil konstruktor dari kelas java yang sama yang memiliki dua parameter.

  3. This digunakan untuk melewatkan instance java saat ini sebagai parameter

    obj.itIsMe(this);
  4. Mirip dengan di atas ini juga dapat digunakan untuk mengembalikan instance saat ini

    CurrentClassName startMethod() {
         return this;
    }

    Catatan: Ini dapat menyebabkan hasil yang tidak diinginkan saat digunakan di kelas dalam di dua poin di atas. Karena ini akan merujuk pada kelas dalam dan bukan contoh luar.

  5. This dapat digunakan untuk mendapatkan pegangan dari kelas saat ini

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

    Padahal ini bisa dilakukan oleh

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

Seperti biasa, thisdikaitkan dengan turunannya dan ini tidak akan berfungsi dalam metode statis.



18

Ini merujuk pada instance objek tertentu saat ini, sehingga Anda dapat menulis sesuatu seperti

public Object getMe() {
    return this;
}

Kasus penggunaan umum thisadalah untuk mencegah pembayangan. Ambil contoh berikut:

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;
    }
}

Dalam contoh di atas, kami ingin menetapkan anggota bidang menggunakan nilai parameter. Karena mereka memiliki nama yang sama, kita perlu cara untuk membedakan antara bidang dan parameter. thismemungkinkan kita untuk mengakses anggota instance ini, termasuk bidang.

public class Person {
    private final String name;

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

4
Berhati-hatilah untuk menggunakan gaya yang tepat saat memanggilnya: o.getMe (). GetMe (). OutOfHere ()
Justin K

8

Dalam Swing, cukup umum untuk menulis kelas yang mengimplementasikan ActionListenerdan menambahkan instance saat ini (yaitu 'ini') sebagai ActionListener untuk komponen.

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

Ini "referensi ke objek dalam konteks saat ini" secara efektif. Misalnya, untuk mencetak "objek ini" Anda dapat menulis:

System.out.println(this);

Perhatikan bahwa penggunaan "variabel global" Anda agak tidak aktif ... jika Anda menggunakannya this.variableNamemaka menurut definisi itu bukan variabel global - itu adalah variabel khusus untuk contoh khusus ini.


7

Mengutip sebuah artikel di programming.guide:


thismemiliki dua kegunaan dalam program Java.

1. Sebagai referensi ke objek saat ini

Sintaks dalam kasus ini biasanya terlihat seperti

this.someVariable = someVariable;

Jenis penggunaan ini dijelaskan di sini: Referensi 'ini' (dengan contoh)

2. Untuk memanggil konstruktor yang berbeda

Sintaks dalam kasus ini biasanya terlihat seperti

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

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

Jenis penggunaan ini dijelaskan di sini: panggilan konstruktor (...) ini (dengan contoh)


4

Ini merujuk pada contoh di mana metode ini dipanggil

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

The ini Keyword ini digunakan untuk merujuk variabel saat blok, misalnya mempertimbangkan kode di bawah ini (Hanya exampple, jadi jangan berharap standar Kode JAWA):

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();
 }
}

Itu dia. Outputnya adalah "2". Jika Kami tidak menggunakan kata kunci ini , maka hasilnya adalah: 0


3

Objek memiliki metode dan atribut (variabel) yang diturunkan dari kelas, untuk menentukan metode dan variabel mana yang berasal dari objek tertentu yang thisdigunakan kata cadangan. dalam kasus variabel instan, penting untuk memahami perbedaan antara parameter implisit dan eksplisit. Lihatlah fillTankpanggilan untuk audiobjek tersebut.

Car audi= new Car();

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

Nilai dalam kurung adalah parameter implisit dan objek itu sendiri adalah parameter eksplisit, metode yang tidak memiliki parameter eksplisit, gunakan parameter implisit, fillTankmetode ini memiliki parameter eksplisit dan implisit.

Mari kita melihat lebih dekat fillTankmetode di Carkelas

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

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

}

Di kelas ini kita memiliki variabel instan "tangki". Mungkin ada banyak objek yang menggunakan variabel instance tangki, untuk menentukan bahwa variabel instance "tangki" digunakan untuk objek tertentu, dalam kasus kami objek "audi" yang kami buat sebelumnya, kami menggunakan thiskata kunci yang dipesan. untuk variabel instan , penggunaan 'ini' dalam metode menunjukkan bahwa variabel instan, dalam kasus kami "tangki", adalah variabel instan dari parameter implisit.

Kompiler java secara otomatis menambahkan thiskata yang dipesan sehingga Anda tidak perlu menambahkannya, itu masalah preferensi. Anda tidak dapat menggunakan thistanpa titik (.) Karena itu adalah aturan java (sintaks).

Singkatnya.

  • Objek didefinisikan oleh kelas dan memiliki metode dan variabel
  • Penggunaan thispada variabel misalnya dalam metode menunjukkan bahwa, variabel instance milik parameter implisit, atau bahwa itu adalah variabel instansi dari parameter implisit.
  • Parameter implisit adalah objek dari mana metode dipanggil dalam hal ini "audi".
  • Kompiler java secara otomatis menambahkan kata yang dipesan ini, menambahkannya adalah masalah preferensi
  • this tidak dapat digunakan tanpa titik (.) ini tidak valid secara sintaksis
  • this juga dapat digunakan untuk membedakan antara variabel lokal dan variabel global yang memiliki nama yang sama
  • yang thiskata cadangan juga berlaku untuk metode, untuk menunjukkan metode milik objek tertentu.

2

Variabel instan umum untuk setiap objek yang Anda buat. katakanlah, ada dua variabel instan

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);



}
}

jika Anda perhatikan kode di atas, kami telah menginisiasi tiga objek dan tiga objek memanggil metode SetMyInstanceValues. Bagaimana menurut Anda JVM dengan benar menetapkan nilai untuk setiap objek? ada triknya, JVM tidak akan melihat kode ini seperti yang ditunjukkan di atas. alih-alih itu, ia akan melihat seperti kode di bawah ini;

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

(Aku tahu aku terlambat, tapi aku akan menjadi boi licik yang tidak pernah kamu lihat)

Kata kunci ini di sebagian besar bahasa pemrograman Berorientasi Objek jika tidak semua berarti referensi terhadap instance objek saat ini dari kelas itu. Ini pada dasarnya sama dengan memanggil objek itu dari luar metode dengan nama. Itu mungkin tidak masuk akal begitu rumit saya:

Di luar kelas, untuk memanggil sesuatu di dalam instance objek tersebut, misalnya mengatakan Anda memiliki objek yang disebut objek dan Anda ingin mendapatkan bidang yang perlu Anda gunakan

object.field

Katakan misalnya Anda mencoba mengakses object.field dari dalam kelas Anda di katakanlah, konstruktor Anda misalnya, Anda dapat menggunakan

this.field

Kata kunci ini pada dasarnya menggantikan kata kunci nama objek ketika dipanggil di dalam kelas. Biasanya tidak ada banyak alasan untuk melakukan ini di luar jika Anda memiliki dua variabel dengan nama yang sama salah satunya menjadi bidang kelas dan yang lainnya hanya menjadi variabel di dalam metode, ini membantu menguraikan antara keduanya. . Sebagai contoh jika Anda memiliki ini: (Hah, mengerti? Ini ? Hehe .... hanya saya? Oke :( Saya akan pergi sekarang)

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

Itu akan menyebabkan beberapa masalah, kompiler tidak akan dapat mengetahui perbedaan antara variabel Nama yang didefinisikan dalam parameter untuk konstruktor dan variabel Nama di dalam deklarasi bidang kelas Anda sehingga ia akan menetapkan parameter Nama ke .. .. nilai parameter Name yang tidak bermanfaat dan benar-benar tidak memiliki tujuan. Ini adalah masalah umum yang dilakukan sebagian besar program baru dan saya juga menjadi korban. Bagaimanapun, cara yang benar untuk mendefinisikan parameter ini adalah dengan menggunakan:

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

Dengan cara ini, kompiler mengetahui variabel Nama yang Anda coba tetapkan adalah bagian dari kelas dan bukan bagian dari metode dan menugaskannya dengan benar, artinya ia memberikan bidang Nama pada apa pun yang Anda masukkan ke dalam konstruktor.

Singkatnya, itu pada dasarnya referensi bidang instance objek dari kelas yang Anda kerjakan, maka itu menjadi kata kunci "ini", yang berarti objek ini , atau instance ini . Merupakan praktik yang baik untuk menggunakan ini ketika memanggil bidang kelas Anda daripada hanya menggunakan nama untuk menghindari kemungkinan bug yang sulit ditemukan karena kompiler berjalan tepat di atasnya.




1

ini dapat digunakan di dalam beberapa metode atau konstruktor.

Ini mengembalikan referensi ke objek saat ini.


1

Ini merujuk pada objek tempat Anda “berada” sekarang. Dengan kata lain, ini merujuk pada objek penerima. Anda menggunakan ini untuk mengklarifikasi variabel mana yang Anda maksud. Halaman Java_whitaperaper: 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;
    }
}

Dalam contoh kode di atas this.x / this.y merujuk ke kelas saat ini yaitu variabel Kelas titik x dan y di mana (x ganda, y ganda) adalah nilai ganda yang dilewatkan dari kelas yang berbeda untuk menetapkan nilai ke kelas saat ini.


0

Saya juga mencari jawaban yang sama, dan entah bagaimana tidak bisa memahami konsepnya dengan jelas. Namun akhirnya saya memahaminya dari tautan ini

ini adalah kata kunci di Jawa. Yang dapat digunakan di dalam metode atau konstruktor kelas. Ini (ini) berfungsi sebagai referensi ke objek saat ini yang metode atau konstruktornya dipanggil. kata kunci ini dapat digunakan untuk merujuk anggota objek saat ini dari dalam metode instance atau konstruktor.

Periksa contoh di tautan untuk pemahaman yang jelas


contoh sempurna
sathya

0

Jika variabel instan sama dengan variabel yang dideklarasikan dalam konstruktor, maka kami menggunakan "ini" untuk menetapkan data.

class Example{
     int assign;// instance variable

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

Semoga ini membantu.


0

Di Jawa "ini" adalah variabel yang sudah ditentukan sebelumnya. Jika kita menggunakan "ini" dalam metode itu berarti kita mendapatkan referensi (alamat) dari objek yang sedang berjalan. Sebagai contoh.

this.age ---> usia objek yang sedang berjalan.


0

Saya ingin membagikan apa yang saya mengerti dari kata kunci ini. Kata kunci ini memiliki 6 penggunaan di java sebagai berikut: -

1. Dapat digunakan untuk merujuk ke variabel kelas saat ini. Mari kita pahami dengan sebuah kode. *

Mari kita pahami masalahnya jika kita tidak menggunakan kata kunci ini dengan contoh yang diberikan di bawah ini:

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();  
}}  

Keluaran:-

0 null 0.0
0 null 0.0

Dalam contoh di atas, parameter (argumen formal) dan variabel instan sama. Jadi, kami menggunakan kata kunci ini untuk membedakan variabel lokal dan variabel instan.

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();  
}} 

keluaran:

111 ankit 5000
112 sumit 6000

2. Untuk memanggil metode kelas saat ini.

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();  
}}  

Keluaran:

hello Natasha
hello Mandy

3. untuk memanggil konstruktor kelas saat ini. Ini digunakan untuk membangun rantai.

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);  
}}

Keluaran:

hello ABCD
10

4. untuk lulus sebagai argumen dalam metode ini.

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();  
  }  
}  

Keluaran:

The method is invoked

5. untuk lulus sebagai argumen dalam panggilan konstruktor

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();  
  }  
} 

Keluaran:-

10

6. untuk mengembalikan instance kelas saat ini

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

Keluaran:-

Hello

Selain itu, kata kunci ini tidak dapat digunakan tanpa. (Titik) karena sintaksnya tidak valid.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.