new
Java,Javascript和C#等语言中的关键字会创建类的新实例。
该语法似乎是从C ++继承的,在C ++中该语法new
专门用于在堆上分配类的新实例,并返回指向该新实例的指针。在C ++中,这不是构造对象的唯一方法。您还可以在不使用new
-的情况下在堆栈上构造一个对象,实际上,这种构造对象的方式在C ++中更为常见。
因此,来自C ++背景,new
Java,Javascript和C#等语言中的关键字对我来说似乎很自然并且很明显。然后,我开始学习没有new
关键字的Python 。在Python中,只需调用构造函数即可构造实例,例如:
f = Foo()
最初,这对我来说似乎有点不对劲,直到我想到Python没有理由拥有它new
,因为所有内容都是一个对象,因此无需区分各种构造函数语法。
但是后来我想new
-Java 的真正意义是什么?我们为什么要说Object o = new Object();
?为什么不只是Object o = Object();
呢?在C ++中,绝对需要new
,因为我们需要区分在堆上分配和在堆上分配之间的区别,但是在Java中,所有对象都在堆上构造,那么为什么还要使用new
关键字呢?对于Javascript,可能会问同样的问题。在我不太熟悉的C#中,我认为new
在区分对象类型和值类型方面可能有一些用途,但是我不确定。
无论如何,在我看来,C ++之后的许多语言只是“继承”了new
关键字-并不需要它。它几乎像一个残余关键字。我们似乎出于任何原因都不需要它,但是它在那里。
问题:我对此是否正确?还是有一些令人信服的理由new
需要以C ++启发的内存管理语言(例如Java,Javascript和C#)而不是Python?
f
不转义函数时,分配堆栈空间。
f
封闭函数返回时GC可以收集对象。
new
关键字。当然,我想创建一个新的变量,愚蠢的编译器!我认为一种好的语言的语法应该是f = heap Foo()
,f = auto Foo()
。