【问题标题】:creating objects with same name as class in java在java中创建与类同名的对象
【发布时间】:2015-02-21 11:18:13
【问题描述】:

在 C++ 中,当我创建如下对象时,不能为同一个类创建更多对象。

Box Box; //Box is the class Name

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

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

这背后的原因是什么?

【问题讨论】:

  • 你的意思是你不能在C++中创建一个类的多个对象吗?喜欢:Box Box; Box box;?
  • Box Box 表示您正在定义引用,它不会创建对象
  • 但是您可以创建更多实例。 class Box b;struct Box b;。无论如何,你真正要问的是什么?
  • 这就是这两种语言的写法。你不能问为什么java叫java,为什么c++不叫java!
  • 就因为c++有这个古怪的设计细节,Java为什么要继承这个?

标签: java c++ object constructor


【解决方案1】:

基本上,Java 的语法规则集略有不同。当语法说你有一个带有初始化器的变量声明时,例如:

Box box = new Box();

...它知道Box 必须是类型的名称,而不是变量的名称。因此,范围内是否有一个名为Box 的变量并不重要。 (这也适用于 new 运算符。)

我不知道 C++ 语法的详细信息,但听起来好像不是为了区分这种情况,至少在您给出的示例中是这样。这不像是一个 feature 本身 - 这只是编译器如何查找名称的问题。

【讨论】:

  • 如果您没有导入 Box 类型,我怀疑您可以执行此操作。即com.something.Box Box = new com.something.Box()。对吗?
【解决方案2】:

Java 对不同类型的标识符使用不同的命名空间。 Java 受限制的语法使得无论您指的是类型、函数、变量还是标签,都不会产生歧义。

【讨论】:

    【解决方案3】:

    有关名称查找如何在 C++ 中工作的详细信息,请参阅标准中的第 3.4 节。

    在您描述的情况下,基本思想是这样的:对于非限定名称(例如 Box 您的代码),编译器在向上移动之前开始在当前范围内搜索声明。当它找到该名称的声明时,任何声明,它都会停止。 因此,在您的情况下,当您尝试声明 Box 类型的新变量时,它会找到变量“Box”的声明并停止搜索。它只是假设 'Box' 是一个变量名,不再看。

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2023-02-26
      • 2016-07-21
      相关资源
      最近更新 更多