使用' new'没有' xyz = new abc'

时间:2014-11-26 21:27:08

标签: 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);
    }   
}

我的问题是 - 在最后一行,使用new语句,而不是=。 正在创造什么?一个新的LwjglApplication对象?类?

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

5 个答案:

答案 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");

    }

}