클래스를 포함하는 인스턴스 필드의 가시성을 Anonymous 내부 클래스(AIC)에 더 잘 이해하고 싶습니다.
AIC가 포함하는 클래스의 인스턴스 ( (익명) 내부 클래스를 사용하는 것이 언제 누수 안전합니까? ). 이 논리를 사용하면 AIC가 정적 메소드 내에서 인스턴스화되는 경우에도 포함 클래스의 인스턴스 필드에 액세스 할 수 있어야합니다. 그러나 컴파일러에서 오류가 발생하여 이것을 테스트하는 방법을 찾을 수 없습니다.
예를 들어, 아래 코드에서 다음과 같은 결과를 얻습니다 :"정적 컨텍스트에서 정적 필드에서 's'를 참조 할 수 없습니다"AIC의 () 방법 :
public interface TestInterface {
void print();
}
public class AICTest {
public String s = "something";
public static void main( String[] args ) {
new TestInterface() {
@Override
public void print() {
System.out.println( s ); **<-- compilation error**
}
}.print();
}
}
위의 예에서 AIC 인스턴스가 's'에 액세스 할 수 있는지 제안 하시겠습니까?
편집/답변 정적 메소드가 클래스 멤버에 액세스하고 인스턴스 메소드가 인스턴스 및 클래스 멤버에 액세스 할 수 있음을 알고 싶습니다. 혼란은 AIC가 클래스 객체를 포함하는 것에 대한 암시 적 참조를 항상 가지고 있다는 일반적인 진술에 관한 것이 었습니다. 이것은 정적 방법 내에서 AIC가 초기화 된 경우가 아닙니다. @shmosel은 내 질문에 답변하는 링크를 공유했습니다 ( Java 정적에서 익명의 내부 클래스를 만들 수 있습니까? ) :"따라서 정적 컨텍스트의 익명 클래스는 정적 중첩 클래스와 거의 동일하므로 둘러싼 클래스에 대한 참조를 유지하지 않습니다. 기술적으로 정적 클래스는 아니지만 ".
- 답변 # 1
- 답변 # 2
원하는 것이 아닐 수도 있지만 다음과 같이 할 수 있습니다 :
interface TestInterface { void print(); } class AICTest { public String s="something"; public static void main(String[] args) { AICTest aicTest=new AICTest(); new TestInterface() { @Override public void print() { System.out.println(aicTest.s); } }.print(); } }
- 답변 # 3
혼란은 AIC가 클래스의 객체를 포함하는 것에 대한 암시 적 참조가 항상 가지고 있다는 일반적인 철학에 관한 것이 었습니다. 이것은 정적 방법 내에서 AIC가 초기화 된 경우가 아닙니다. @shmosel은 내 질문에 대답하는 링크를 공유했습니다 (Java에서 익명 내부 클래스를 정적으로 만들 수 있습니까?). "정적 컨텍스트의 익명 클래스는 정적 중첩 클래스와 거의 동일합니다. 기술적으로 정적 클래스가 아니더라도 포함 클래스입니다. ".
관련 자료
- python - 다른 함수 내에서 호출되는 모의 클래스 메서드
- reactjs - DOM 요소와 상호 작용하고 인수가없는 기능적 컴포넌트 내에 정의 된 메소드를 테스트하는 방법
- Powershell 클래스의 메소드 내에서 여러 변수 리턴
- java - 동일한 클래스의 인스턴스 메소드 내부에서 정적 메소드 사용
- javascript - 정적 메소드의 첫 번째 매개 변수는 호출 된 클래스를 참조합니까?
- java - 메소드에 정적 변수 번호를 어떻게 추가합니까?
- javascript - 반응 - 정적 메서드는 항상 정의되지 않은 값을 반환
- typescript - 클래스에서 정적 메소드의 이름을 얻는 방법은 무엇입니까?
- java - 정적 메소드 URLEncoderencode를 어떻게 테스트 하시겠습니까?
- android - 매개 변수가있는 onClick to 정적 메서드에 대한 Howto androidx-databinding
- 타입 스크립트 유형의 정적 메소드 참조 - 메소드 서명 자동 픽업
- concurrency - 스프링에서 정적 메소드를 통해 Bean을 공개하는 방법
- java - "DetachedCriteria"클래스에"forClass"라는 정적 메서드가 있지만 사용할 수 없습니다
- vuejs2 - 정적 메소드는 함수가 아닙니다 - typescript 부
- c# - 왜 정적이 아닌 정적 메소드를 사용합니까?
- mocking - juni5와 mockito 또는 easymock으로 정적 메소드를 조롱 할 수 있습니까?
- c# - ASP Net Core의 정적 메소드에 대한 종속성 주입
- .net : MonoDevelop 잘못된 정적 메서드 호출 구문 : "[MSBuild] :: GetTargetFrameworkIdentifier ( '$ (TargetFramework)'
- java - 비 정적 메소드 내에서 클래스 인스턴스없이 비 정적 메소드 호출
- android - onClickListener를 정적 메서드로 만들기
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
's'는 인스턴스 변수이므로
명확하게, 'main'을 실행해도 AICTest의 인스턴스가 생성되지 않습니다. AICTest의 인스턴스를 만들려면 어딘가에 '새로운'작업을 수행해야합니다.에서 's'를 읽으려면 AICTest 인스턴스가 있어야합니다. 다음은 잠재적으로 어디서나 올 수있는 기존 AICTest 객체에 액세스하도록 수정 된 예제를 나타내는 예제입니다.또 다른 옵션은 's'를 정적으로 만드는 것입니다. 그런 다음 특정 AICTest 객체와 연결되지 않으므로 AICTest 객체를 인스턴스화하지 않은 경우에도 존재합니다.
알다시피, 가시성 수정자는 추가하지 않았습니다. 가시성에 대한 당신의 생각은 건전했습니다. 그렇지 않으면 's'에 액세스하는 것이 합리적이라면 코드에 가시성이 있습니다. 여기서 문제는 가시성과 아무 관련이 없습니다.