2011-04-07 157 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()被调用,你怎么骂另外一个?