2011-04-07 3 views
0
class cricket{ 
    void bat(){ 
     System.out.println("sachin"); 
    } 
    public static void main(String ar[]){ 
     cricket cricket=new cricket(); 
     cricket.bat(); 
    } 
} 

출력 : sachin만드는 개체


오브젝트 이름은 possible..the 프로그램이 이유는 정확 output.wt이다주고있다 name..how 클래스와 동일하다?

답변

6

을 자바 컴파일러가 볼 때 :

cricket cricket=new cricket(); 

가 왼쪽 변수 선언이 있음을 알고 오른쪽은 클래스가 새로운 '사이에 허용되기 때문에 생성자 호출이다 '및 (.

로컬 변수는 다른 이름 공간 ("로컬 블록 범위")에 저장되므로 작동합니다.

그러나 눈치 챘을 때 독자에게는 혼란 스럽습니다. 자바에 대한 규칙은 "클래스 이름을 대문자로"말할 이유 :

Cricket cricket = new Cricket(); 

상단에서 문자는 완전히 자바 컴파일러에 의해 무시하지만 인간의 독자들에게 큰 도움입니다.

+0

명확하고 쉽게 이해할 수있는 대답을 주신 것에 대해 감사드립니다. –

2

이것은 허용됩니다 (개체 이름과 클래스 이름이 충돌하지 않음). 그러나 혼란 스럽기 때문에 일반적으로 좋은 생각이 아닙니다.

7

일반적으로 클래스는 대문자로 시작하고 변수는 그렇지 않습니다. 변수와 같은 이름의 클래스를 갖는 동작을 멈추게하는 것은 없습니다. 그럴 수없는 유일한 시간은 예약어입니다. 정적 일부 혼란을 일으킬 수있는 클래스와 동일한 변수를 갖는

class Cricket{ 
    void bat(){ 
    System.out.println("sachin"); 
    } 
    public static void main(String ar[]){ 
    Cricket cricket=new Cricket(); 
    cricket.bat(); 
    } 
} 

: 코드는보다 전통적인 될 것 인 경우에 예를 들어 당신이

int int = 3; // not allowed 
Integer Integer = 3; // allowed, but discouraged 

할 수 없었다,이 것 방법뿐만 아니라. 이것을 고려하십시오 :

void foo(Runnable r) throws Exception { 
    Thread Thread = new Thread(r); 
    Thread.start(); 
    Thread.sleep(100); // Okay, now WTF does this do? 
} 
+0

왜'Thread.sleep'에 혼란이 있습니까? – aioobe

+0

'Thread'라는 변수가 있기 때문에. 이제 변수에 정적 메서드를 사용하는 데 혼란이있었습니다. 그러나 클래스 이름의 섀도 잉에 의해 복합되었습니다. – corsiKa

1

이 정말 지저분 곳이다 :

다른 하나 chirp()가 호출되고, 그리고 어떻게 부릅니까
class bug { 
    public static void chirp() { 
    } 
} 

class cricket { 
    public void chirp() { 
    } 
} 

//... 
cricket bug = new cricket(); 
bug.chirp(); 

?

관련 문제