为什么在Java实例化期间将类命名为两次?

use*_*841 12 java syntax types

实例化对象时,为什么要指定该类两次?

OddEven number = new OddEven();
Run Code Online (Sandbox Code Playgroud)

你为什么不能说出来number = new OddEven();?当我声明一个字符串时,我只说String一次:

String str = "abc";
Run Code Online (Sandbox Code Playgroud)

实际上,我的问题不是"为什么你这样做" - 显然,你这样做是因为你必须 - 但是,为什么创作者选择让Java语法像这样工作呢?

我的想法是:

  1. Java在低级别运行的方式有一些基础,需要输入两次名称,或者
  2. 创作者可以自由选择这样做以保持语法的某些方面一致 - 首先声明类型?或者它更像是它的前辈?

Jim*_*son 44

因为你可以这样做:

Superclass x = new Subclass();
Run Code Online (Sandbox Code Playgroud)

引用的类型可以是要声明的实际对象的超类,因此您需要同时指定它们.例如,你可以这样做:

List<String> stringList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

您的程序与实现List的对象交互,而您不关心实现.

  • 为了进一步增强Jim的(正确)评论 - 你想要使用Superclass的原因是因为你可以编程到界面.这样,如果ArrayList是一个很好的选择作为接口,但稍后,您发现LinkedList是更好的选择,您可以切换到LinkedList而无需更改应用程序的其余部分. (4认同)

Ste*_*eve 5

看似冗余的类型名称的原因是您正在执行两个单独的操作,每个操作都要求您指定一个类型.

在左侧,您将声明具有特定类型的变量(存储位置).在右侧,您将创建具有特定类型的新对象.中间的"="会引起您创建的新对象的引用,该对象将放置在您创建的存储位置中.

每侧的类型不必相同.例如,这是合法代码:

Object number = new OddEven();
Run Code Online (Sandbox Code Playgroud)

关键字String仅在第二个示例中显示一次的原因是String类型隐含在右侧,因为"xxx"是String常量.它只是简写:

String string = new String("xxx");
Run Code Online (Sandbox Code Playgroud)