使用'new'而不使用'xyz = new abc'

jdu*_*ton 4 java libgdx

我有一个课程如下:

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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 在最后一行,使用的new语句没有前面的=.正在创造什么?一个新LwjglApplication对象?类?

为什么不需要像实例那样app = new LwjglApplication()进行实例化?

APe*_*son 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)
}
Run Code Online (Sandbox Code Playgroud)

在这里,没有对返回值进行任何操作,foo()println()调用仍将运行.

当构造函数(在这种情况下,构造函数LwjglApplication)具有有益的副作用时,通常使用此方法.在您的特定情况下,由于构造函数而弹出一个窗口.(正如RafazZ所说,您不需要访问正在构建的对象,因为有其他方法可以访问它,通过第三方供应商的API提供.)

正如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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,程序不会为新创建的Foo对象分配名称,因为它仅用于调用其bar()方法.