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)
在这种情况下,我们总会看到"不需要新"
在java中,你总是必须使用new实例化对象(好吧,几乎总是).随getAssests()您检索已创建的一个.我想你的问题来自c ++,其中new分配动态内存,但由于java只有动态对象,所以总是需要new.
在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()方法中的代码的作用。该代码可能总是MyClass在new 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构造函数有您想要触发的副作用。但是,由于通常认为构造函数具有任何不平凡的副作用(或者更笼统地说,除了设置新对象之外还执行其他任何操作)是不好的样式,因此通常不应该为编写此类代码提供任何借口。