我有一个课程如下:
package org.requiredinput.rpg1.desktop;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import org.requiredinput.rpg1.Rpg1;
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config =
new LwjglApplicationConfiguration();
config.title = "Awesome rpg";
config.width = 800;
config.height = 480;
new LwjglApplication(new Rpg1(), config);
}
}
我的问题是 - 在最后一行,使用new
语句,而不是=
。
正在创造什么?一个新的LwjglApplication
对象?类?
为什么不需要像app = new LwjglApplication()
那样实例化?
答案 0 :(得分:11)
您的代码会创建一个新对象并且没有为其命名,这意味着之后main()
无法使用它。构造函数中的代码仍将运行,仍将创建类型为LwjglApplication
的对象。不过,main()
不会引用它。
这就像调用一个返回值而不将其赋值给变量的函数一样:
int foo() {
System.out.println("Ron Paul 2016!");
return 42;
}
public static void main(String... args) {
foo(); // will print out "Ron Paul 2016!" (w/o quotes)
}
此处,foo()
的返回值未执行任何操作,但println()
调用仍将继续运行。
当构造函数(在本例中为LwjglApplication
的构造函数)具有有益的副作用时,通常会使用此方法。在您的特定情况下,由于构造函数而弹出一个窗口。 (作为RafazZ said,您不需要访问正在构建的对象,因为通过第三方供应商的API提供了其他访问方式。)< / p>
正如Drew Kennedy在评论中提到的,这种模式也用于一次性对象。
我们假设你有一个类似这样的课程:
class Foo {
void bar() {
// stuff that requires being in an instance, such as...
System.out.println(this.getClass());
}
public static void main(String... args) {
(new Foo()).bar();
}
}
请注意,程序不会为新创建的Foo
对象分配名称,因为它仅用于调用其bar()
方法。< / p>
答案 1 :(得分:2)
根据BadLogic文档,LwjglApplication创建了一个轻量级的全屏窗口。这有时在设计游戏之类的东西时完成 - 你创建一个窗口,然后忘掉它,因为你不需要明确地修改它。您仍然可以使用其他方法对其进行修改 - 为此您需要更熟悉供应商提供的API(在您的情况下为BadLogic)。
Here is a top level description for LwjglApplication.
TL; DR UPDATE:调用DesktopLauncher
后,它将通过调用new LwjglApplication
创建一个OpenGL全屏窗口对象。每次调用OpenGL方法时,它都会假定您暗示在DesktopLauncher
中创建的对象。
答案 2 :(得分:1)
正在创建LwjglApplication对象,但未对变量进行ASSIGNED。
所以基本上你以后不能访问它。但它存在。
答案 3 :(得分:1)
正在创建一个对象,但您没有为其分配标签。作者很可能只对调用LwjglApplication构造函数感兴趣。
与其他人所说的相反,创建的对象不一定用于垃圾收集。根据特定对象,对象可以通过几种方式实际保持活动,例如,Singleton。
答案 4 :(得分:0)
new MyClass()
是Java中的构造函数调用语法。构造函数是一种特殊方法,它返回一个构造对象。它有一些nuanses,但通常可以被视为方法调用。
所以没有作业的new
只是调用一个函数而不是使用它的返回值。
Java中的所有函数都可以使用(不使用返回值)。
例如,原因可能是副作用。因此构造函数可以在一些全局静态列表中注册它的结果。
如果返回值是一个对象并且实际上没有使用它,那么它将在以后进行垃圾收集,就像每个未使用的对象一样。
示例:
package tests;
public class Runner {
public static class Line {
public Line(String line) {
System.out.println(line);
}
}
public static void main(String[] args) {
new Line("Hello world");
}
}