什么时候使用'new'关键字?

foo*_*512 9 java object new-operator

什么时候需要new在Java中使用关键字.我知道你应该在创建像这样的对象的实例时使用它:

TextView textView = new TextView(this);
Run Code Online (Sandbox Code Playgroud)

有时在代码中我注意到new没有使用,我感到困惑..在这行代码中:

    AssetManager assetManager = getAssets();
Run Code Online (Sandbox Code Playgroud)

为什么不像这样创建AssetManager的实例:

AssetManager assetManager = new AssetManager();
Run Code Online (Sandbox Code Playgroud)

那么它被设置为等于getAssests()?

什么时候应该new使用?

谢谢!

aho*_*der 11

在第一次显式创建对象时,可以使用new关键字.然后,不需要使用getter方法new获取对象,因为该对象已经存在于内存中,因此不需要重新创建.

如果你想要更详细的描述新访问oracle文档

如果一个对象为null,则该对象将需要'new'关键字(这对于未初始化是很奇特的).

编辑:

在当前情况下,这将始终打印"需要新的".

Object mObj = null;
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");

OUTPUTS: needs new
Run Code Online (Sandbox Code Playgroud)

所以要修复它,你会做类似的事情:

Object mObj = new Object();
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");
OUTPUTS: does NOT need new
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们总会看到"不需要新"


zel*_*ler 7

在java中,你总是必须使用new实例化对象(好吧,几乎总是).随getAssests()您检索已创建的一个.我想你的问题来自c ++,其中new分配动态内存,但由于java只有动态对象,所以总是需要new.


Ilm*_*nen 5

在Java中,new MyClass() 创建一个新的实例MyClass,并返回对它的引用。

同时,声明:

MyClass foo;
Run Code Online (Sandbox Code Playgroud)

定义了一个变量foo,该变量可以存储对的实例的引用MyClass,或者null表示不存在此类引用的特殊值。如果您不引用任何内容foo,则默认值为null

您当然可以将这些东西结合起来,例如:

MyClass foo;           // define a variable foo that can store an object reference
foo = new MyClass();   // create a new object and assign a reference to it to foo
Run Code Online (Sandbox Code Playgroud)

或者,等效地,像这样:

MyClass foo = new MyClass();  // combined variable definition and assignment
Run Code Online (Sandbox Code Playgroud)

但是,不必每次给引用变量分配内容时创建一个新实例。您也可以这样做:

MyClass foo, bar;      // define two reference variables, foo and bar
foo = new MyClass();   // create a new object and assign a reference to it to foo
bar = foo;             // now foo and bar point to the same object
Run Code Online (Sandbox Code Playgroud)

甚至:

MyClass foo = new MyClass(), bar = foo;  // same, but shorter
Run Code Online (Sandbox Code Playgroud)

请注意,在Java中,与某些其他语言(如C ++)相反,您永远不能将实际对象分配给变量。而是,始终通过对其引用来访问Java对象。当有人说Java中的“将对象分配给变量”或“将对象作为参数传递”或“从方法返回对象”时,他们实际上实际上是指分配或传递或返回对对象的引用


您的代码调用可以(并且经常这样做)的方法还返回对对象的引用。例如,如果您的类具有如下方法:

private MyClass getSomeObject() {
    // ...some code here...
}
Run Code Online (Sandbox Code Playgroud)

您可以调用它并将引用保存到返回的变量中,如下所示:

MyClass foo;
foo = getSomeObject();
Run Code Online (Sandbox Code Playgroud)

或像这样:

MyClass foo = getSomeObject();
Run Code Online (Sandbox Code Playgroud)

从方法声明中我们可以看出,getSomeObject()总是会返回对MyClass实例(或null)的引用,但不会返回该实例的实际来源。这完全取决于getSomeObject()方法中的代码的作用。该代码可能总是MyClassnew MyClass()每次调用时创建一个新实例,并返回对该实例的引用,或者可能总是返回对同一对象的引用。或者,当然,它有时可能返回对新对象的引用,有时还返回对先前创建的对象的引用。


请注意,如果为变量分配新值,则之前包含的任何变量都将被忘记。如果被遗忘的值恰好是对某个对象的最后引用,则该对象本身将被Java的垃圾回收器破坏。

因此,例如,虽然当然可以执行以下操作:

MyClass foo = new MyClass();  // create a new object and assign (a reference to) it to foo
foo = getSomeObject();        // forget the previous content of foo and replace it with whatever getSomeObject() returns
Run Code Online (Sandbox Code Playgroud)

这通常没有任何意义,因为您将创建一个新MyClass实例,只是立即丢弃对它的唯一引用,并用其他实例替换它。实际上,上面的代码完全等同于:

new MyClass();       // create a new object and throw away(!) the reference to it
MyClass foo = getSomeObject();  // assign whatever getSomeObject() returns to foo
Run Code Online (Sandbox Code Playgroud)

唯一甚至遥不可及的时间是,如果您创建一个新MyClass实例并立即让它被垃圾回收,例如,因为MyClass构造函数有您想要触发的副作用。但是,由于通常认为构造函数具有任何不平凡的副作用(或者更笼统地说,除了设置新对象之外还执行其他任何操作)是不好的样式,因此通常不应该为编写此类代码提供任何借口。