Java에서 "this"의 의미는 무엇입니까?


140

일반적으로 this생성자에서만 사용 합니다.

this.something전역 변수와 이름이 같은 경우 매개 변수를 식별하는 데 사용됩니다 (을 사용하여 ).

그러나 thisJava 의 실제 의미 가 this도트 ( .) 없이 사용하면 어떻게 될지 알 수 없습니다 .



2
야크 쉬 마쉬! 그래서 친구들. - 당신은 여기뿐만 아니라 내 질문을 참조 할 수 있습니다 stackoverflow.com/questions/23334336/... Chenqui을.
Erran Morad

답변:


157

this 현재 객체를 나타냅니다.

각 비 정적 메서드는 개체의 컨텍스트에서 실행됩니다. 따라서 다음과 같은 수업이 있으면

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

그런 다음 호출 frobnicate()new MyThisTest()인쇄됩니다

1
42
MyThisTest a = 42

따라서 여러 가지 용도로 효과적으로 사용합니다.

  • 필드와 이름이 같은 다른 것이있을 때 필드에 대해 이야기하고 있음을 분명히하십시오.
  • 현재 객체를 전체적으로 참조
  • 생성자에서 현재 클래스의 다른 생성자를 호출하십시오.

작동하지 않습니다. main방법이 필요 하다는 오류가 발생 합니다. 메인 메소드를 추가하면 거기에서 호출해야합니다. 그리고 main 내부에서 frobnicate ()를 호출하려고하면 정적 참조 내부에서 비 정적 참조를 호출 할 수 없다고 말합니다. 정적을 제거 main하면 기본 메소드를 찾을 수 없다는 오류가 다시 리턴됩니다. 설명 해주십시오.
dbconfession

7
@dbconfession : 여기에있는 코드는 독립 실행 형 자체 실행 프로그램이 아닙니다. 당신은 읽을 것을 의미 합니다 코드 텍스트를 실행하지! 유효한 코드이지만 데모 목적으로 만 사용됩니다 (그래서 적절한 주가없는 이유). 주요 방법에 대한 도움말은 stackoverflow.com/questions/146576/…을 참조하십시오 .
Joachim Sauer

@Joachim 감사합니다! 메소드를 정적으로 만드는 것이 무엇을 의미하는지에 대한 근본적인 내용이 누락되었습니다.this. 작동 . 나의 이해는 즉 this.당신이 호출하지 않고라고 존재하는 방법이나 변수의 다른 버전을 허용, 클래스의 인스턴스화 된 버전에 고유 한 방법 또는 변수를 호출 할 수 있습니다 this. 라는 간단한에서 Test.class나는 두 가지 방법이를 : public static void main()public Test() I main정적이며 생성자를 정적으로 만들 수 없으므로 메소드간에 정보를 전달할 수 없습니다. 새로운 질문으로 게시해야합니까?
dbconfession

@ dbconfession : 귀하의 질문이 이미 다른 곳에서 답변 된 느낌이 들지만, 귀하의 질문이 정확히 무엇인지 파악하지 못하므로 게시 할 수도 있습니다 (그러나 중복으로 닫을 준비가되어 있습니다). 그러나 가장 기본적인 수준에서 메서드를 만드는 것은 static기본적으로 클래스를 호출 할 클래스의 인스턴스가 필요하지 않으며 this내부에 액세스 할 수 없다는 것을 의미 합니다.
Joachim Sauer

@JoachimSauer 실행하려면 어떻게해야합니까? dbconfession과 같은 문제가 있습니다.
퍼지 머핀

52

다음은 here 의 복사 및 붙여 넣기 이지만 this키워드 의 모든 다른 사용법을 잘 설명 합니다.

정의 : Java의 this키워드는 사용되는 메소드의 현재 인스턴스를 참조하는 데 사용됩니다.

이를 사용하는 방법은 다음과 같습니다.

  1. 정적 또는 로컬 변수 대신 인스턴스 변수가 사용됨을 구체적으로 나타냅니다. 그건,

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

    여기서 이것은 인스턴스 변수를 나타냅니다. 여기서 로컬 변수의 우선 순위가 높습니다. 따라서 부재this 는 지역 변수를 나타냅니다. 매개 변수 이름 인 로컬 변수가 인스턴스 변수와 동일하지 않은 경우에 관계없이 인스턴스 변수를 this나타냅니다.

  2. This 생성자를 참조하는 데 사용됩니다

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

    두 개의 매개 변수가있는 동일한 Java 클래스의 생성자를 호출합니다.

  3. This 현재 Java 인스턴스를 매개 변수로 전달하는 데 사용됩니다.

    obj.itIsMe(this);
  4. 위와 유사하게 현재 인스턴스를 반환하는 데 사용될 수도 있습니다.

    CurrentClassName startMethod() {
         return this;
    }

    참고 : 위 두 가지 점에서 내부 클래스에서 사용되는 경우 원하지 않는 결과가 발생할 수 있습니다. 이것은 외부 인스턴스가 아닌 내부 클래스를 참조하기 때문입니다.

  5. This 현재 클래스의 핸들을 얻는 데 사용할 수 있습니다

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

    이 작업을 수행 할 수 있지만

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

항상 그렇듯이 this인스턴스와 연관되어 있으며 정적 메소드에서는 작동하지 않습니다.



18

특정 객체의 현재 인스턴스를 참조하므로 다음과 같이 작성할 수 있습니다.

public Object getMe() {
    return this;
}

일반적인 사용 사례는 this그림자를 방지하는 것입니다. 다음 예제를 보자.

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

위의 예에서 매개 변수 값을 사용하여 필드 멤버를 지정하려고합니다. 그것들은 같은 이름을 공유하기 때문에 필드와 매개 변수를 구별 할 수있는 방법이 필요합니다. this필드를 포함하여이 인스턴스의 멤버에 액세스 할 수 있습니다.

public class Person {
    private final String name;

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

4
호출 할 때 올바른 스타일을 사용하도록주의하십시오. o.getMe (). getMe (). outOfHere ()
Justin K

8

Swing ActionListener에서 현재 인스턴스 (예 : 'this') 를 구현 하고 컴포넌트의 ActionListener로 추가 하는 클래스를 작성하는 것이 일반적 입니다.

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

효과적으로 "현재 컨텍스트의 개체에 대한 참조"입니다. 예를 들어 "this object"를 인쇄하려면 다음과 같이 작성하십시오.

System.out.println(this);

"전역 변수"의 사용법은 다소 벗어난 점에 유의하십시오. 사용하는 경우 this.variableName정의에 따라 전역 변수 가 아닙니다 .이 특정 인스턴스에 특정한 변수입니다.


7

programming.guide에서 기사 인용하기 :


this두 가지 용도를 자바 프로그램을.

1. 현재 객체에 대한 참조

이 경우 구문은 일반적으로 다음과 같습니다.

this.someVariable = someVariable;

이 사용 유형은 여기에 설명되어 있습니다 : 'this'참조 (예제 포함)

2. 다른 생성자를 호출하려면

이 경우 구문은 일반적으로 다음과 같습니다.

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

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

이 사용 유형은 여기에 설명되어 있습니다. this (…) 생성자 호출 (예제 포함)


4

메소드가 호출 된 인스턴스를 나타냅니다.

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

키워드 (그래서 표준 자바 코드를 기대 해달라고, 그냥 exampple) 코드 아래 고려 예를 들어, 블록의 현재 변수를 참조하는 데 사용됩니다 :

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

그게 다야. 출력은 "2"가됩니다. this 키워드를 사용하지 않으면 출력은 다음과 같습니다. 0


3

객체에는 this예약어가 사용되는 특정 객체에 속하는 메소드 및 변수를 지정하기 위해 클래스에서 파생 된 메소드 및 속성 (변수)이 있습니다 . 인스턴스 변수의 경우 암시 적 매개 변수와 명시 적 매개 변수의 차이점을 이해하는 것이 중요합니다. 객체 fillTank호출을 살펴보십시오 audi.

Car audi= new Car();

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

괄호 안의 값은 암시 적 매개 변수이고 객체 자체는 명시 fillTank적 매개 변수입니다.

클래스 의 fillTank메소드를 자세히 살펴 보겠습니다.Car

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

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

}

이 클래스에는 인스턴스 변수 "tank"가 있습니다. 인스턴스 변수 "tank"가 특정 객체에 사용되도록 지정하기 위해 tank 인스턴스 변수를 사용하는 많은 객체가있을 수 있습니다.이 경우 이전에 생성 한 "audi"객체는 thisreserved 키워드를 사용합니다 . 예를 들어 변수메소드 에서 'this'를 사용합니다. 하면 인스턴스 변수 (이 경우 "tank")가 암시 적 매개 변수의 인스턴스 변수임을 나타냅니다.

Java 컴파일러는 this예약어를 자동으로 추가 하므로 추가 할 필요가 없습니다. 선호하는 문제입니다. thisjava (구문)의 규칙이므로 dot (.) 없이는 사용할 수 없습니다 .

요약해서 말하자면.

  • 객체는 클래스로 정의되며 메소드와 변수가 있습니다
  • 메소드 에서 인스턴스 변수 를 사용 this하면 인스턴스 변수 가 내재적 매개 변수에 속하거나 내재적 매개 변수의 인스턴스 변수임을 나타냅니다.
  • 암시 적 매개 변수는이 경우 "audi"에서 메소드가 호출되는 오브젝트입니다.
  • 자바 컴파일러는이 예약어를 자동으로 추가하여 선호도를 추가합니다.
  • this 점 (.) 없이는 사용할 수 없습니다. 이것은 구문 상 유효하지 않습니다.
  • this 동일한 이름을 가진 지역 변수와 전역 변수를 구별하는 데 사용될 수도 있습니다.
  • this예약어 또한 방법은, 특정 개체에 속하는 표시하는 방법에 적용된다.

2

인스턴스 변수는 생성하는 모든 객체에 공통입니다. 예를 들어 두 개의 인스턴스 변수가 있습니다

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



}
}

위의 코드를 발견하면 3 개의 객체를 시작했으며 3 개의 객체가 SetMyInstanceValues ​​메서드를 호출합니다. JVM이 모든 객체의 값을 올바르게 할당한다고 생각하십니까? 트릭이 있습니다. JVM은이 코드가 위에 어떻게 표시되는지 알 수 없습니다. 그 대신 아래 코드와 같이 보일 것입니다.

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

(나는 늦게 나는 알고 있지만, 나는 당신이 나를 보지 못한 비열한 boi 인 것입니다.)

가장 객체 지향 프로그래밍 언어 키워드가 모든 수단 경우 그 클래스의 현재 개체 인스턴스를 향한 자사의 참조. 기본적으로 메소드 외부에서 이름으로 해당 객체를 호출하는 것과 같습니다. 아마 이해가되지 않았으므로 정교하게 설명합니다.

클래스 외부에서 객체의 해당 인스턴스 내에서 무언가를 호출하려면 예를 들어 객체라는 객체가 있고 사용해야 할 필드를 원한다고 가정하십시오.

object.field

예를 들어 클래스 내부에서 object.field 에 액세스하려고하면 예를 들어 생성자를 사용할 수 있습니다.

this.field

키워드는 기본적으로 내부 클래스의 호출되는 개체 이름 키워드를 대체합니다. 이름이 같은 두 개의 변수 중 하나가 클래스의 필드이고 다른 하나는 메서드 내부의 변수 인 경우 일반적으로 외부 에서이 작업을 수행 할 이유가별로 없습니다. . 예를 들어 당신이 이것을 가지고 있다면 : (아, 알 겠어요? ? Hehe .... 저만 요?

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

컴파일러는 생성자의 매개 변수에 정의 된 Name 변수와 클래스 필드 선언 내부의 Name 변수 사이의 차이점을 알 수 없으므로 대신 Name 매개 변수를 할당합니다. .. 유익하지 않고 문자 그대로 목적이없는 Name 매개 변수의 값. 이것은 대부분의 최신 프로그램에서 흔히 발생하는 문제이며 피해자이기도합니다. 어쨌든이 매개 변수를 정의하는 올바른 방법은 다음을 사용하는 것입니다.

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

이런 식으로 컴파일러는 할당하려는 Name 변수가 클래스의 일부이며 메서드의 일부가 아니라는 것을 알고 올바르게 할당합니다. 즉, Name 필드를 생성자에 넣은 모든 것에 할당합니다.

요약하자면, 기본적으로 작업중인 클래스의 객체 인스턴스 필드를 참조하므로 키워드 "this"는 객체 또는 인스턴스를 의미 합니다. 컴파일러가 바로 실행하는 동안 찾기 어려운 버그를 피하기 위해 이름을 사용하는 대신 클래스의 필드를 호출 할 때 이것을 사용하는 것이 좋습니다.




1

이것은 일부 메소드 또는 생성자 내에서 사용될 수 있습니다.

현재 객체에 대한 참조를 반환합니다.


1

이것은 당신이 지금 "있는"객체를 말합니다. 즉, 수신 객체를 나타냅니다. 이것을 사용하여 참조하는 변수를 명확하게합니다. Java_ 백서 페이지 : 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;
    }
}

위의 예제 코드에서 this.x / this.y는 Point 클래스 x 및 y 변수 인 현재 클래스를 나타냅니다. 여기서 (double x, double y)는 현재 클래스에 값을 할당하기 위해 다른 클래스에서 전달 된 이중 값입니다.


0

나는 또한 같은 대답을 찾고 있었고 어떻게 든 개념을 명확하게 이해할 수 없었습니다. 그러나 마침내 나는이 링크 에서 그것을 이해했다.

이것은 Java의 키워드입니다. 메소드 또는 클래스 생성자에서 사용할 수 있습니다. 메소드 또는 생성자가 호출되는 현재 객체에 대한 참조로 작동합니다. 이 키워드는 인스턴스 메소드 또는 생성자 내에서 현재 객체의 모든 멤버를 참조하는 데 사용할 수 있습니다.

명확한 이해를 위해 링크 의 예를 확인하십시오.


완벽한 예
sathya

0

인스턴스 변수가 생성자에서 선언 된 변수와 동일하면 "this"를 사용하여 데이터를 할당합니다.

class Example{
     int assign;// instance variable

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

도움이 되었기를 바랍니다.


0

Java에서 "this"는 사전 정의 된 변수입니다. 메소드에서 "this"를 사용하면 현재 실행중인 오브젝트의 참조 (주소)를 얻는다는 의미입니다. 예를 들어.

this.age ---> 현재 실행중인 객체의 연령입니다.


0

이 키워드에서 이해 한 내용을 공유하고 싶습니다. 이 키워드는 다음과 같이 Java에서 6 가지 사용법을 갖습니다.

1. 현재 클래스 변수를 참조하는 데 사용할 수 있습니다. 코드로 이해하자. *

아래 예에서이 키워드를 사용하지 않으면 문제를 이해하십시오.

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

산출:-

0 null 0.0
0 null 0.0

위의 예에서 매개 변수 (공식 인수)와 인스턴스 변수는 동일합니다. 따라서이 키워드를 사용하여 로컬 변수와 인스턴스 변수를 구별합니다.

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

산출:

111 ankit 5000
112 sumit 6000

2. 현재 클래스 메소드를 호출합니다.

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

산출:

hello Natasha
hello Mandy

3. 현재 클래스 생성자를 호출합니다. 생성자 체인에 사용됩니다.

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

산출:

hello ABCD
10

4. 메소드에서 인수로 전달합니다.

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

산출:

The method is invoked

5. 생성자 호출에서 인수로 전달

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

산출:-

10

6. 현재 클래스 인스턴스를 반환

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

산출:-

Hello

또한이 키워드는 구문이 유효하지 않으므로. (점)없이 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.