Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于一个完全初学者来说,Java在创建新对象时似乎是多余的_Java - Fatal编程技术网

对于一个完全初学者来说,Java在创建新对象时似乎是多余的

对于一个完全初学者来说,Java在创建新对象时似乎是多余的,java,Java,如果这个问题看起来很愚蠢,我很抱歉,我是一个完全的初学者,Java构造新对象的方式对我来说似乎是多余的。例如,使用矩形包: import java.awt.Rectangle Rectangle box = new Rectangle(5,10,20,30) 那么为什么我们要写两次矩形呢?只是写 box = new Rectangle(5,10,20,30) 还不够吗?以这种方式编写很明显,我的对象将从矩形构造函数创建。您需要同时编写这两个构造函数的原因是语义上的差异 如果您只写box=…

如果这个问题看起来很愚蠢,我很抱歉,我是一个完全的初学者,Java构造新对象的方式对我来说似乎是多余的。例如,使用矩形包:

import java.awt.Rectangle

Rectangle box = new Rectangle(5,10,20,30)
那么为什么我们要写两次矩形呢?只是写

box = new Rectangle(5,10,20,30)

还不够吗?以这种方式编写很明显,我的对象将从矩形构造函数创建。您需要同时编写这两个构造函数的原因是语义上的差异

如果您只写
box=…
,那么您就给一个名为
box
的预先存在的变量或字段赋值。但在分配之前,它必须存在于该范围内

如果改为编写
rectanglebox=…
,则在该范围内定义一个新变量并为其赋值


无法编写
矩形框=(5,10,20,30)的原因
是指,可能有许多不同的类符合类
矩形
。原因是Java中类的固有特性,即它们是可扩展的(除了一系列例外)。这意味着变量的类型(
Rectangle
)并不总是必须与实际对象的类型完全相同。

需要同时编写这两个变量的原因是语义上的差异

如果您只写
box=…
,那么您就给一个名为
box
的预先存在的变量或字段赋值。但在分配之前,它必须存在于该范围内

如果改为编写
rectanglebox=…
,则在该范围内定义一个新变量并为其赋值


无法编写
矩形框=(5,10,20,30)的原因
是指,可能有许多不同的类符合类
矩形
。原因是Java中类的固有特性,即它们是可扩展的(除了一系列例外)。这意味着变量的类型(
Rectangle
)并不总是必须与实际对象的类型完全相同。

指定变量的类型和实例化的对象的类并不总是多余的

两者可能不同

例如,您可以编写

Shape box = new Rectangle(5,10,20,30);
它允许您编程到接口(
形状
),而不是特定的实现(
矩形

如果希望变量的类型与实例化的类相同,可以从Java 10开始使用
var

var box = new Rectangle(5,10,20,30);
除此之外,在声明新变量时,必须告诉编译器

如果你只是写信

box = new Rectangle(5,10,20,30);

编译器希望
变量已经在该语句范围内的某个地方声明。添加变量类型(或
var
)可以让编译器知道这是一个新变量。

指定变量类型和实例化对象的类并不总是多余的

两者可能不同

例如,您可以编写

Shape box = new Rectangle(5,10,20,30);
它允许您编程到接口(
形状
),而不是特定的实现(
矩形

如果希望变量的类型与实例化的类相同,可以从Java 10开始使用
var

var box = new Rectangle(5,10,20,30);
除此之外,在声明新变量时,必须告诉编译器

如果你只是写信

box = new Rectangle(5,10,20,30);

编译器希望
变量已经在该语句范围内的某个地方声明。添加变量类型(或
var
)可以让编译器知道这是一个新变量。

形式的语句

Foo f = new Bar(....);

他说了两件事。首先,它表示变量
f
的类型是
Foo
。在右侧,您说您正在创建一个类型为
Bar
的对象。如果
Foo
Bar
的超类型,则允许这样做。Java中的变量和对象都有类型。

以下形式的语句

Foo f = new Bar(....);

他说了两件事。首先,它表示变量
f
的类型是
Foo
。在右侧,您说您正在创建一个类型为
Bar
的对象。如果
Foo
Bar
的超类型,则允许这样做。Java中的变量和对象都有类型。

我认为这里要理解的重要概念是对象和变量之间的区别

右侧的“新建矩形…”创建一个对象,并返回对该对象的引用

左侧的“矩形框”声明了一个变量,该变量能够保存对矩形(或从矩形子类化的任何其他对象)的引用,但本课程中没有该变量

这些东西可以单独存在:您可以创建对象,而无需立即将值保存在新声明的变量中;举个假设的例子,也许你想

    draw(new Rectangle(5,10,20,30));
要创建一个矩形,请以某种方式显示它,这样就不需要再次引用该矩形。同样,您可以声明一个变量,而无需立即初始化它

    Rectangle box;
当然,在这种情况下,您最终需要为box指定一个值,使其有用,但不必在声明时执行

最后,正如其他答案所述

   Rectangle box = …

它们完全不同。第一个声明新变量,第二个使用现有变量。如果我们将第二种情况作为隐式声明,那么您很容易出现键入错误:可能您键入的是“b0x”而不是“box”,而现在您的“box”中有一个bug没有得到预期的值。由于这个原因,大多数但不是所有的编程语言都需要显式声明变量


是的,Java有点罗嗦。

我认为这里要理解的重要概念是
Rectangle box = new Rectangle(5,10,20,30);
Rectangle box = new Rectangle(6,11,21,31);
def my_function(name):
    print(name)
public static void myFunction(String name){
    System.out.print(name);
}