Ý nghĩa của những trò chơi này trong Java là gì?


140

Thông thường, tôi chỉ sử dụng thistrong các nhà xây dựng.

Tôi hiểu rằng nó được sử dụng để xác định biến tham số (bằng cách sử dụng this.something), nếu nó có cùng tên với biến toàn cục.

Tuy nhiên, tôi không biết ý nghĩa thực sự của thisJava là gì và điều gì sẽ xảy ra nếu tôi sử dụng thismà không có dấu chấm ( .).



2
Yakshemash! Các bạn cũng vậy. Bạn cũng có thể muốn tham khảo câu hỏi của tôi ở đây - stackoverflow.com/questions/23334336/ khăn Chenqui.
Erran Morad

Câu trả lời:


157

this đề cập đến đối tượng hiện tại.

Mỗi phương thức không tĩnh chạy trong ngữ cảnh của một đối tượng. Vì vậy, nếu bạn có một lớp học như thế này:

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

Sau đó gọi frobnicate()vào new MyThisTest()sẽ in

1
42
My ThisTest a = 42

Vì vậy, hiệu quả bạn sử dụng nó cho nhiều thứ:

  • làm rõ rằng bạn đang nói về một lĩnh vực, khi đó cũng có một cái gì đó khác có cùng tên với một lĩnh vực
  • đề cập đến toàn bộ đối tượng hiện tại
  • gọi các hàm tạo khác của lớp hiện tại trong hàm tạo của bạn

Điều này không hiệu quả. Tôi nhận được một lỗi nói rằng một mainphương pháp là bắt buộc. Nếu tôi thêm phương thức chính, thì tôi phải gọi từ đó. Và bất kỳ nỗ lực nào để gọi frobnicate () bên trong main đều nói rằng bạn không thể gọi một tham chiếu không tĩnh từ bên trong một tham chiếu tĩnh. Và loại bỏ tĩnh khỏi maintrả về lỗi một lần nữa mà không tìm thấy phương thức chính nào. Vui lòng giải thích.
dbconfession

7
@dbconfession: mã ở đây không có nghĩa là một chương trình độc lập, tự chạy. Bạn có nghĩa là để đọc các đang các văn bản, không chạy nó! Đó là mã hợp lệ, nhưng nó chỉ có ý nghĩa cho mục đích trình diễn (đó là lý do tại sao nó không có mã chính phù hợp). Để được trợ giúp với phương thức chính, vui lòng xem stackoverflow.com/questions/146576/ ,.
Joachim Sauer

@Joachim Cảm ơn! Tôi đang thiếu một cái gì đó cơ bản về ý nghĩa của việc làm cho một phương thức tĩnh và cách thức this.hoạt động. Hiểu biết của tôi là this.cho phép bạn gọi một phương thức hoặc biến duy nhất cho phiên bản khởi tạo của lớp, cho phép một phiên bản khác của phương thức hoặc biến tồn tại được gọi mà không cần gọi this. Trong một cách đơn giản gọi là Test.classtôi có hai phương thức: public static void main()public Test() tôi không thể truyền thông tin giữa các phương thức vì maintĩnh và các hàm tạo không thể được tạo tĩnh. Tôi có nên đăng một câu hỏi mới?
dbconfession

@dbconfession: Tôi có cảm giác câu hỏi của bạn đã được trả lời ở nơi khác, nhưng tôi không hiểu chính xác câu hỏi của bạn là gì, vì vậy bạn cũng có thể đăng nó (nhưng hãy chuẩn bị để đóng lại như một bản sao). Tuy nhiên, ở cấp độ cơ bản nhất, việc tạo một phương thức staticvề cơ bản có nghĩa là bạn không cần một thể hiện của lớp để gọi nó và bạn sẽ không có quyền truy cập vào thisbên trong nó.
Joachim Sauer

@JoachimSauer Nếu tôi muốn chạy nó, tôi sẽ làm thế nào? Tôi đã có cùng một vấn đề như dbconfession.
FudgeMuffins

52

Sau đây là một bản sao và dán từ đây , nhưng giải thích rất rõ tất cả các cách sử dụng khác nhau của thistừ khóa:

Định nghĩa: Từ khóa của Java thisđược sử dụng để chỉ trường hợp hiện tại của phương thức mà nó được sử dụng.

Sau đây là những cách để sử dụng điều này:

  1. Để biểu thị cụ thể rằng biến thể hiện được sử dụng thay cho biến tĩnh hoặc biến cục bộ. Đó là,

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

    Ở đây điều này đề cập đến biến thể hiện. Ở đây mức độ ưu tiên cao cho biến cục bộ. Do đó sự vắng mặt của thisbiểu thị biến cục bộ. Nếu biến cục bộ là tên của tham số không giống với biến thể hiện thì không phân biệt thisđược sử dụng hay không, nó biểu thị biến thể hiện.

  2. This được sử dụng để giới thiệu các nhà xây dựng

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

    Điều này gọi hàm tạo của cùng một lớp java có hai tham số.

  3. This được sử dụng để truyền đối tượng java hiện tại làm tham số

    obj.itIsMe(this);
  4. Tương tự như trên, điều này cũng có thể được sử dụng để trả về thể hiện hiện tại

    CurrentClassName startMethod() {
         return this;
    }

    Lưu ý: Điều này có thể dẫn đến kết quả không mong muốn trong khi được sử dụng trong các lớp bên trong ở hai điểm trên. Vì điều này sẽ đề cập đến lớp bên trong chứ không phải thể hiện bên ngoài.

  5. This có thể được sử dụng để có được xử lý của lớp hiện tại

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

    Mặc dù điều này có thể được thực hiện bởi

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

Như mọi khi, thisđược liên kết với thể hiện của nó và điều này sẽ không hoạt động trong các phương thức tĩnh.


44

Để được hoàn thành, thiscũng có thể được sử dụng để chỉ đối tượng bên ngoài

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

5
thislà những gì tôi đang tìm kiếm! ;)
forresthopkinsa

3
Đó chỉ làsuper
killjoy

18

Nó đề cập đến thể hiện hiện tại của một đối tượng cụ thể, vì vậy bạn có thể viết một cái gì đó như

public Object getMe() {
    return this;
}

Một trường hợp sử dụng phổ biến thislà để ngăn chặn bóng. Lấy ví dụ sau:

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

Trong ví dụ trên, chúng tôi muốn chỉ định thành viên trường sử dụng giá trị của tham số. Vì chúng có cùng tên, chúng ta cần một cách để phân biệt giữa trường và tham số. thischo phép chúng tôi truy cập các thành viên của trường hợp này, bao gồm cả trường.

public class Person {
    private final String name;

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

4
Hãy cẩn thận để sử dụng phong cách phù hợp khi gọi nó: o.getMe (). GetMe (). OutOfHere ()
Justin K

8

Trong Swing khá phổ biến để viết một lớp thực hiện ActionListenervà thêm cá thể hiện tại (tức là 'this') làm ActionListener cho các thành phần.

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

Đó là "một tham chiếu đến đối tượng trong bối cảnh hiện tại" một cách hiệu quả. Ví dụ: để in ra "đối tượng này", bạn có thể viết:

System.out.println(this);

Lưu ý rằng việc sử dụng "biến toàn cục" của bạn có phần tắt ... nếu bạn đang sử dụng this.variableNamethì theo định nghĩa, đó không phải là biến toàn cục - đó là một biến cụ thể cho trường hợp cụ thể này.


7

Trích dẫn một bài viết tại lập trình.guide:


thishai cách sử dụng trong một chương trình Java.

1. Làm tài liệu tham khảo cho đối tượng hiện tại

Cú pháp trong trường hợp này thường trông giống như

this.someVariable = someVariable;

Loại sử dụng này được mô tả ở đây: Tham chiếu 'this' (có ví dụ)

2. Để gọi một nhà xây dựng khác

Cú pháp trong trường hợp này thường trông giống như

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

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

Kiểu sử dụng này được mô tả ở đây: lệnh gọi hàm tạo (()) này (có ví dụ)


4

Nó đề cập đến trường hợp mà phương thức được gọi

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

Các này từ khóa được sử dụng để tham khảo biến hiện tại của một khối, ví dụ xem xét bên dưới mã (Chỉ cần một exampple, vì vậy không mong đợi Bộ luật JAVA tiêu chuẩn):

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

Đó là nó. đầu ra sẽ là "2". Nếu chúng tôi không sử dụng từ khóa này , thì đầu ra sẽ là: 0


3

Các đối tượng có các phương thức và thuộc tính (biến) có nguồn gốc từ các lớp, để chỉ định phương thức và biến nào thuộc về một đối tượng cụ thể mà thistừ dành riêng được sử dụng. trong trường hợp các biến thể hiện, điều quan trọng là phải hiểu sự khác biệt giữa các tham số ngầm định và rõ ràng. Hãy nhìn vào fillTankcuộc gọi cho audiđối tượng.

Car audi= new Car();

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

Giá trị trong ngoặc là tham số ẩn và chính đối tượng là tham số rõ ràng, các phương thức không có tham số rõ ràng, sử dụng tham số ẩn, fillTankphương thức có cả tham số rõ ràng và tham số ẩn.

Hãy xem xét kỹ hơn fillTankphương thức trong Carlớp

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

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

}

Trong lớp này, chúng ta có một biến "tank". Có thể có nhiều đối tượng sử dụng biến đối tượng tank, để xác định rằng biến "tank" được sử dụng cho một đối tượng cụ thể, trong trường hợp của chúng tôi, đối tượng "audi" chúng tôi đã xây dựng trước đó, chúng tôi sử dụng thistừ khóa dành riêng. cho các biến Ví dụ việc sử dụng 'này' trong một phương pháp chỉ ra rằng biến Ví dụ, trong trường hợp của chúng tôi "bể", là ví dụ biến của tham số ngầm.

Trình biên dịch java tự động thêm thistừ dành riêng để bạn không phải thêm từ đó, đó là vấn đề ưu tiên. Bạn không thể sử dụng thismà không có dấu chấm (.) Vì đó là các quy tắc của java (cú pháp).

Tóm tắt.

  • Các đối tượng được định nghĩa bởi các lớp và có các phương thức và biến
  • Việc sử dụng thismột biến đối tượng trong một phương thức chỉ ra rằng, biến đối tượng đó thuộc về tham số ẩn hoặc đó là một biến thể hiện của tham số ẩn.
  • Tham số ngầm định là đối tượng mà phương thức được gọi từ trong trường hợp này là "audi".
  • Trình biên dịch java tự động thêm từ dành riêng này, thêm nó là một vấn đề ưu tiên
  • this không thể được sử dụng mà không có dấu chấm (.) điều này không hợp lệ về mặt cú pháp
  • this cũng có thể được sử dụng để phân biệt giữa các biến cục bộ và biến toàn cục có cùng tên
  • các thistừ dự trữ cũng áp dụng cho phương pháp, để chỉ ra một phương pháp thuộc về một đối tượng cụ thể.

2

Biến sơ thẩm là phổ biến cho mọi đối tượng mà bạn tạo. nói, có hai biến đối tượng

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



}
}

nếu bạn nhận thấy đoạn mã trên, chúng tôi đã khởi tạo ba đối tượng và ba đối tượng đang gọi phương thức SetMyInstanceValues. Bạn nghĩ JVM gán chính xác các giá trị cho mọi đối tượng như thế nào? Có một mẹo, JVM sẽ không thấy mã này như thế nào được hiển thị ở trên. thay vì đó, nó sẽ thấy như mã bên dưới;

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

(Tôi biết tôi đến muộn nhưng tôi là người lén lút mà bạn chưa từng thấy tôi)

Các này từ khóa trong hầu hết các Object Oriented ngôn ngữ lập trình nếu không phải tất cả các phương tiện mà tham khảo một của nó đối với trường hợp đối tượng hiện tại của lớp đó. Về cơ bản, nó giống như cách gọi đối tượng đó từ bên ngoài phương thức theo tên. Điều đó có lẽ không có ý nghĩa vì vậy Ill chi tiết:

Bên ngoài lớp, để gọi một cái gì đó trong thể hiện của đối tượng đó, ví dụ như một câu nói bạn có một đối tượng được gọi là đối tượng và bạn muốn có được một trường bạn sẽ cần sử dụng

object.field

Ví dụ, bạn đang cố gắng truy cập object.field từ bên trong lớp của bạn, ví dụ, hàm tạo của bạn, bạn có thể sử dụng

this.field

Các này từ khóa cơ bản thay thế từ khóa tên đối tượng khi được gọi bên trong của lớp. Thường không có nhiều lý do để làm điều này bên ngoài nếu bạn có hai biến cùng tên, một trong số đó là một trường của lớp và biến kia chỉ là một biến trong một phương thức, nó giúp giải mã giữa hai biến . Ví dụ: nếu bạn có thứ này: (Hah, hiểu không? Cái này ? Hehe .... chỉ tôi? Được không :( Tôi sẽ rời đi ngay bây giờ)

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

Điều đó sẽ gây ra một số vấn đề, trình biên dịch sẽ không thể biết được sự khác biệt giữa biến Tên được xác định trong các tham số cho hàm tạo và biến Tên bên trong khai báo trường của lớp để thay vào đó, nó sẽ gán tham số Tên cho .. .. giá trị của tham số Tên không có lợi và thực sự không có mục đích. Đây là một vấn đề phổ biến mà hầu hết các chương trình mới hơn làm và tôi cũng là nạn nhân của nó. Dù sao, cách chính xác để xác định tham số này sẽ là sử dụng:

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

Theo cách này, trình biên dịch biết biến Tên mà bạn đang cố gán là một phần của lớp chứ không phải là một phần của phương thức và gán nó chính xác, nghĩa là nó gán trường Tên cho bất cứ thứ gì bạn đặt vào hàm tạo.

Nói tóm lại, về cơ bản nó tham chiếu đến một lĩnh vực của trường hợp đối tượng của lớp bạn đang làm việc trên, do đó nó là từ khóa "này", tức là phần này đối tượng, hay này ví dụ. Đó là một cách thực hành tốt để sử dụng điều này khi gọi một trường trong lớp của bạn thay vì chỉ sử dụng tên để tránh các lỗi có thể khó tìm vì trình biên dịch chạy ngay trên chúng.




1

điều này có thể được sử dụng bên trong một số phương thức hoặc hàm tạo.

Nó trả về tham chiếu đến đối tượng hiện tại.


1

Điều này đề cập đến đối tượng mà bạn đang sử dụng ở ngay bây giờ. Nói cách khác, điều này đề cập đến đối tượng nhận. Bạn sử dụng điều này để làm rõ biến nào bạn đang đề cập đến. Trang Java_whitepaper: 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;
    }
}

Trong ví dụ trên, mã this.x / this.y này đề cập đến lớp hiện tại là các lớp Điểm x và y trong đó (double x, double y) là các giá trị kép được truyền từ lớp khác nhau để gán giá trị cho lớp hiện tại.


0

Tôi cũng đang tìm kiếm câu trả lời tương tự, và bằng cách nào đó không thể hiểu rõ khái niệm này. Nhưng cuối cùng tôi đã hiểu nó từ liên kết này

đây là một từ khóa trong Java. Mà có thể được sử dụng bên trong phương thức hoặc hàm tạo của lớp. Nó (cái này) hoạt động như một tham chiếu đến một đối tượng hiện tại có phương thức hoặc hàm tạo đang được gọi. từ khóa này có thể được sử dụng để giới thiệu bất kỳ thành viên nào của đối tượng hiện tại từ bên trong một phương thức cá thể hoặc một hàm tạo.

Kiểm tra các ví dụ trong liên kết để hiểu rõ hơn


ví dụ hoàn hảo
sathya

0

Nếu các biến đối tượng giống như các biến được khai báo trong hàm tạo thì chúng ta sử dụng "this" để gán dữ liệu.

class Example{
     int assign;// instance variable

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

Hi vọng điêu nay co ich.


0

Trong Java "đây" là một biến được xác định trước. Nếu chúng ta sử dụng "this" trong phương thức đó có nghĩa là chúng ta đang nhận được tham chiếu (địa chỉ) của đối tượng hiện đang chạy. Ví dụ.

this.age ---> tuổi của đối tượng hiện đang chạy.


0

Tôi muốn chia sẻ những gì tôi hiểu từ từ khóa này. Từ khóa này có 6 cách sử dụng trong java như sau: -

1. Nó có thể được sử dụng để chỉ biến lớp hiện tại. Hãy để chúng tôi hiểu với một mã. *

Hãy hiểu vấn đề nếu chúng ta không sử dụng từ khóa này bằng ví dụ dưới đây:

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

Đầu ra: -

0 null 0.0
0 null 0.0

Trong ví dụ trên, các tham số (đối số chính thức) và các biến thể hiện là như nhau. Vì vậy, chúng tôi đang sử dụng từ khóa này để phân biệt biến cục bộ và biến thể hiện.

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

đầu ra:

111 ankit 5000
112 sumit 6000

2. Để gọi phương thức lớp hiện tại.

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

Đầu ra:

hello Natasha
hello Mandy

3. để gọi hàm tạo của lớp hiện tại. Nó được sử dụng để xây dựng chuỗi.

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

Đầu ra:

hello ABCD
10

4. để vượt qua như là một đối số trong phương thức.

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

Đầu ra:

The method is invoked

5. để vượt qua như một đối số trong lệnh gọi hàm tạo

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

Đầu ra: -

10

6. để trả về thể hiện của lớp hiện tại

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

Đầu ra: -

Hello

Ngoài ra, từ khóa này không thể được sử dụng mà không có. (Dấu chấm) vì cú pháp của nó không hợp lệ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.