2012-04-19 18 views
1

작은 코드를 작성했습니다.왜 나는 오류가 발생하지 않습니까?

System out = null; 
out.out.println("Hello"); 

이것은 잘 작동하고 콘솔에서 Hello를 인쇄합니다.

지금 내 프로그램 또는 내 범위에서, out 하나는 System의 대상이며, 또 다른 PrintStream의 목적은 이름을 가진 두 물체가 있습니다.

지금 내 질문은 왜 Duplicate local variable out.

내가 여기서 무엇을 놓치고 있음을 컴파일러 오류/런타임 오류가 발생하고 있지 않다입니까? 미리 감사드립니다.

+0

설명에서 두 번째'out'을 선언하는 코드는 어디에 있습니까? –

+0

Secound out은 Syso에서 사용하는 PrintStream의 객체입니다. – vikiiii

+0

그건 로컬 변수가 아니에요 ... –

답변

5

아니요, out이라는 유형의 개체 인 System 유형의 로컬 변수가 있습니다. 다른 하나는 out.out으로, 직접 "귀하의 범위 내에"있지 않습니다.

컴파일 타임 오류가 발생할 이유가 없습니다.

가 (BTW, null 참조를 통해 정적 필드를 참조/정적 메소드를 호출하는 것은 꽤 혼란, 정말 좋은 방법이 아닙니다.)

+0

감사합니다. 매트. 기본 사항을 정리하고 싶습니다. 왜 내가이 질문을했는지 알고 있습니다. 왜 누군가가 나를 싫어했는지 알지 못합니다. – vikiiii

0

당신은 같은 범위에있는 같은 이름을 가진 두 개의 변수를 선언하지 않습니다. 선언 한 out은 프로그램 범위에 있고 PrintWriter의 out은 시스템 클래스에서 정적 변수로 선언됩니다. 예를 들어

..

class System { 
    .... 
    PrintWriter out ; 
    .... 
} 

class YourClass{ 
    public void yourMethod() 
    { 
    System out = null; 
    // as PrintWriter's out is declared as static, so you can call like this 
    // without any run-time exception such as NullPointerException 
    out.out.println("Hello"); 
    } 
} 
0

하기에 간단한 : 당신은 클래스 System의 정적 필드에 액세스하는 법적,하지만 눈살을 찌푸렸다-에 방법 : 타입 System의 변수로 적격 대신에 의해 글자 그대로 클래스 이름 System을 사용합니다. 이 두 표현식은 정확히 동일한 의미를 갖습니다.

((System)null).out.println("a"); 
System.out.println("a"); 
관련 문제