2

我是 Java 新手,我想弄清楚为什么有些代码是以一种方式而不是另一种方式编写的。在 Java 中构造对象时,语法类似于

class variable = new class(parameters);

或者

class variable;
variable = new class(parameters);

我想知道为什么类名必须被调用两次。正如Wikipedia上所记录的那样,Python(我也不知道)遵循我认为更直观的方法,即

variable = class(parameters)

是因为 Java 可以处理其他可能性吗?例如

class1 variable = ... class2(parameters)

提前致谢。

4

6 回答 6

4

因为左侧可以是引用类型,而右侧可以是任何可分配的对象类型。

variable这将类型class1的引用变量分配给class1.

class1 variable = new class1(parameters);

这会分配variable类型class1为 的对象的引用变量subclass1,其中subclass1可以是接口的子类class1或实现class1

class1 variable = new subclass1(parameters);

Python 使用动态类型(Duck Typing),因此您不需要声明变量。动态类型语言是在运行时完成变量类型检查的语言。

静态类型编程语言是那些在使用变量之前不需要定义变量的语言。这意味着静态类型与变量在使用之前的显式声明(或初始化)有关。Java 是静态类型语言的一个例子。缺乏类型推断的静态类型语言(例如 C 和 Java)要求程序员声明他们打算使用的方法或函数的类型。这可以作为程序的附加文档,编译器不允许程序员忽略或允许偏离同步。静态类型语言是在编译时完成变量类型检查的语言。

Python(我也不知道)遵循我认为更直观的方法

动态类型的关注点是:

variable = class(parameters);

以后如果你错误地拼错了变量名variablevaraible它不会在编译时被捕获,但你可能会在运行时得到错误的输出或异常。使用静态类型,Java 可以在编译时检测到此类缺陷。

于 2013-06-14T10:50:26.180 回答
3

因为它们意味着不同的东西 - 并且不需要相同。

左边的类描述符定义了变量的类型。这限制了可以分配给该变量的内容,并且还为调用者提供了一些关于那里的对象可以做什么的保证。

右边出现的类名实际上是构造函数的“方法名”。您正在调用一个创建新对象的方法。您创建的对象可以是任何东西,只要它可以分配给变量的类型。

例如,您可以这样做:

Object foo = new String("bar");

或这个:

Collection x = new ArrayList();

(尽管在实践中您可能希望在最后一个上使用泛型参数 - 我将它们留在这里以免混淆类的问题。)

于 2013-06-14T11:01:43.343 回答
2

Java 是一种静态类型的编程语言。但是,Python 是一种动态类型的编程语言。

维基百科在这里有很好的解释。

于 2013-06-14T10:52:03.343 回答
1

左侧(引用定义类型)是对可以是该类的类型或该引用类型的任何子类的对象或实例的引用。此外,根据以下参考, Python 是一种动态类型编程语言,其中每个变量名(除非它是null)都仅绑定到一个对象。另一方面,Java 是一种静态类型的编程语言。

于 2013-06-14T10:51:35.260 回答
1

类名必须被调用两次,因为您必须指定实例的类型。创建新实例时,您还可以执行以下操作:

public class Test extends Test1 {}
...
Test1 test = new Test(parameters);

这样做将确定您可以实际访问哪些类的变量和方法,同时维护类字段等内容。

于 2013-06-14T10:56:09.923 回答
1
SomeClass variable;
variable = new SomeClass(params);

第一行声明了一个变量并声明它的类型为SomeClass。此时变量为空,不引用任何内容。

第二行创建一个新的类型对象SomeClass并将对它的引用存储在variable.

将这两件事写在一行中,如下所示:

SomeClass variable = new SomeClass(params);

可以使事情变得更短。但最后总是有一个变量声明和一个对象构造。变量必须始终是某种类型,不能声明没有类型的变量(Java 是强类型的)。

于 2013-06-14T10:57:18.100 回答