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

輸出: 薩欽創建對象


對象名稱是一樣的name..how它possible..the程序是否給出正確output.wt的原因是類?

回答

6

當Java編譯器看到:

cricket cricket=new cricket(); 

它知道左邊是一個變量聲明,右側是一個構造函數調用,因爲只有一個類之間允許「新'和(

局部變量保存在一個不同的名稱空間(「本地塊範圍」),所以這個工作。

但是,正如您注意到的,它會讓讀者感到困惑。這就是爲什麼Java的規則說「大寫的類名」:

Cricket cricket = new Cricket(); 

大寫字母完全由Java編譯器忽略,但它是爲人類的讀者有很大的幫助。

+0

謝謝你給出一個清晰易懂的答案.. – 2011-04-07 15:29:22

2

這是允許的(對象名稱和類名稱不會碰撞),但它很混亂,所以它通常被認爲不是一個好主意。

7

按照慣例,類以大寫字母開頭,變量不以大寫字母開頭。沒有什麼能夠阻止將一個具有相同名稱的類作爲變量的行爲。唯一不能做到這一點的是保留字。例如,你可以這樣做

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

如果你的代碼是更傳統的,這將是這樣的:

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

具有可變的確切相同的類會引起一些混亂與靜方法也是如此。試想一下:

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 2011-04-07 15:10:19

+0

因爲還有一個叫做'Thread'的變量。現在,在變量上使用靜態方法已經很混亂,但是它被類名稱的陰影所複合。 – corsiKa 2011-04-07 15:59:03

1

這是它變得非常凌亂:

class bug { 
    public static void chirp() { 
    } 
} 

class cricket { 
    public void chirp() { 
    } 
} 

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

哪個chirp()被調用,你怎麼罵另外一個?