매개변수가 업데이트해야 할 필드를 가릴 수 있다
- "Ada"라는 이름의 객체가 있다. setName(String name) 메소드에서 "Bo" 인자를 받아 name = name을 실행한다.
- 비정질 이름들은 모두 매개변수를 가리키므로 객체는 여전히 "Ada"를 가진다. this.name = name은 매개변수 값을 필드에 할당하여 업데이트한다.
"이 객체"
- 인스턴스 메서드 내부에서 **
this**은 메서드가 호출된 객체를 가리킵니다.student.addScore(10)는this= 해당student로 실행됩니다. this.score는 "내가 작업 중인 객체의score"를 의미합니다. 이를 통해 메서드는 자신의 객체를 명시적으로 언급할 수 있습니다.
필드와 파라미터 구분하기
- 주요 용도: 같은 이름의 파라미터와 인스턴스 변수를 구분하는 것입니다.
void setName(String name) { this.name = name; } this.name는 인스턴스 변수이며, 단순한name는 파라미터입니다. 이는 3.8의 섀도우링 버그에 대한 표준 수정 방법입니다.
리시버 객체에 대한 접근
this는 메서드가 정확히 어떤 객체에 대해 호출되었는지에 대한 레퍼런스를 제공합니다. 코드를 직접 작성하든 그렇지 않든 모든 인스턴스 메서드에는 암묵적인this가 존재합니다.- score라는 이름이 섀도우링되지 않은 인스턴스 필드를 지칭할 때,
score += s;는this.score을 사용합니다. 만약 score라는 파라미터나 로컬 변수가 이를 가려(shadow) 있다면, 비수식 qualifier(qualifier 없는) 이름은 그 변수를 가리킵니다. 섀도우링을 해결해야 하는 경우 등 필요할 때만this를 명시적으로 작성합니다.
this는 수신자 객체를 가리킴
setName 내부에서 this는 이 메서드를 호출한 ada 객체입니다.
인스턴스 메서드 내부에서 this는 ...를 가리킵니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
this는 현재 객체에 대한 핸들입니다.
setName(String name) { this.name = name; }에서 this.name은 ...입니다
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
this.name은 필드이며, plain name은 파라미터입니다.
this 키워드는 정적 메서드 내부에서도 사용할 수 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
정적 메서드는 특정 객체가 없으므로 this도 없습니다.
setName(String name) 내부에서 name = name; (this 없음)는 무엇을 하겠습니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
두 이름 모두 파라미터입니다; 필드에 접근하려면 this.name을 사용해야 합니다.
显式로 작성하든 안 하든 모든 인스턴스 메서드에는 암묵적인 this가 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
인스턴스 메서드에는 현재 수신자가 존재합니다. 무규격 score는 매개변수나 로컬 변수가 해당 필드를 가림(shadows)하지 않을 때만 this.score을 의미합니다.
정적 메서드에는 this가 없음
- 정적 메서드(static method) 는
this가 없습니다. 특정 객체에 연결되어 있지 않기 때문입니다. 따라서 정적 메서드는this나 비수식 qualifier 인스턴스 필드를 사용할 수 없으나, 접근 권한이 허용될 경우 명시적인 레퍼런스를 통해 인스턴스 필드를 읽을 수는 있습니다. - 정적 메서드 내에서
this를 사용하려는 시도는 컴파일 오류입니다.this가 필요하다면 이 메서드는 정적이 아닌 인스턴스 메서드여야 합니다.
쉐도우링을 극복하기 위해 this.field = param;를 사용하십시오 — this.name는 인스턴스 변수이고, 단순한 name는 파라미터입니다. name = name;를 작성하면(this 없이) 파라미터를 자신에게 할당할 뿐입니다. 그리고 this는 정적 메서드에 존재하지 않습니다 — 정적 메서드는 특정 객체가 없으므로在那里使用this则无法编译。
Type the field value after the faulty setName("Bo") call on the described object.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
alias과 a가 동일한 Student를 가리킬 경우, alias.setName("Di")로 변경된 이름은 이후 a를 통해 읽히게 됩니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
두 참조 모두 동일한 수신자 객체를 지칭하며, 이 객체의 필드가 업데이트됩니다.
객체 b의 코드가 a.setName("Cy")를 호출합니다. setName 내부에서 this는 어떤 객체를 가리키나요?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
수신자 a가 this를 제공하며, 이는 다른 어떤 객체의 코드에 의해 호출이 시작되었든 상관없습니다.
this를 이용한 쉐도우링 버그 수정:
- 인스턴스 변수
private String name; void setName(String name) { this.name = name; }— 맞습니다!this.name(필드)에name(파라미터)의 값이 할당됩니다.
추론을 새로운 사례로 확장하기
- separately 생성된animations Ada와 Bo라는 학생 a와 b를 추적해 봅시다.
a.setName("Cy")는 a를 Cy로 변경하지만 b는 여전히 Bo입니다. 만약 alias=a라면,alias.setName("Di")는 동일한 첫 번째 객체를 변경하므로 a는 이제 Di를 읽게 됩니다. - 리시버는 인스턴스 메서드가 작동하는 객체이지, 반드시 코드를 호출한 객체는 아닙니다. 정적 메서드는 명시적인 객체 레퍼런스를 작동시킬 수 있으나 암묵적인 this는持有하지 않습니다.
this는 현재 객체를 가리킵니다 — 인스턴스 메서드가 호출된 객체입니다.其主要用途是解决쉐도우링(shadowing): this.name = name;는 파라미터를 인스턴스 변수에 할당합니다. 모든 인스턴스 메서드에는 암시적인 this가 있지만, 정적 메서드에는 없으므로那里不能用于this。