在java中创建与类同名的对象 在C++中,当我创建一个像下面这样的对象时,就不能为同一个类创建更多的对象。 Box Box; //Box is the class Name

在java中创建与类同名的对象 在C++中,当我创建一个像下面这样的对象时,就不能为同一个类创建更多的对象。 Box Box; //Box is the class Name,java,c++,object,constructor,Java,C++,Object,Constructor,在这里,Box变成了一个对象,每当我们再次使用Box时,编译器就会将其识别为一个对象。但在java的情况下,情况并非如此 Box Box = new Box(); Box box = new Box(); //valid 这背后的原因是什么?基本上,从发音上看,Java的语法规则略有不同。当语法表示您有一个带有初始值设定项的变量声明时,例如: Box box = new Box(); 。。。它知道Box必须是类型的名称,而不是变量的名称。因此,范围中是否有名为Box的变量并不重要。(这也

在这里,Box变成了一个对象,每当我们再次使用
Box
时,编译器就会将其识别为一个对象。但在java的情况下,情况并非如此

Box Box = new Box(); 
Box box = new Box(); //valid 

这背后的原因是什么?

基本上,从发音上看,Java的语法规则略有不同。当语法表示您有一个带有初始值设定项的变量声明时,例如:

Box box = new Box();
。。。它知道
Box
必须是类型的名称,而不是变量的名称。因此,范围中是否有名为
Box
的变量并不重要。(这也适用于新的操作符。)


我不知道C++语法的细节,但听起来好像没有设置这个区别,至少在你给出的例子中。这并不是说它本身就是一个特性,而是编译器如何查找名称的问题。

Java对不同类型的标识符使用不同的名称空间。java的受限语法使您不必明确引用类型、函数、变量或标签。< / P> < P>详细说明C++中如何查找名称,参见标准中的第3.4节。< /P> 在您描述的例子中,基本思想是:对于非限定名称(如代码框),编译器在向上移动之前开始搜索当前范围中的声明。当它找到该名称的声明时,任何声明都会停止。
因此,在您的例子中,当您尝试声明Box类型的新变量时,它会找到变量“Box”的声明并停止搜索。它只是假设“box”是一个变量名,并且没有进一步的看。

你是说你不能在C++中创建一个以上的类对象吗?比如:
Box;盒子
Box-Box
表示您正在定义引用,它不会创建对象。但您可以创建更多实例<代码>类别框b
结构框b。不管怎样,你到底在问什么?这就是这两种语言的写作方式。你不能问为什么java被称为java,为什么C++不被称为java!正因为C++有这种奇怪的设计细节,为什么java继承这个?我怀疑如果你没有导入<代码> BOX类型,你可以这样做。i、 e.
com.something.Box Box=new com.something.Box()
。对吗?