为什么Toast可以在没有new关键字的情况下实例化?

时间:2015-06-12 17:16:04

标签: java android

因此,对于Toast类,它显然可以这样写:

Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT)
toastMessage.show();

为什么toastMessage可以在没有new关键字的情况下实例化并用作对象?

如何通过方法实例化toastMessage?

3 个答案:

答案 0 :(得分:8)

这里Toast没有什么特别之处。您只是调用一个创建实例的静态方法(或者可能重用现有实例 - 它是一个实现细节)。这是一个你会在整个地方看到的模式 - 例如Calendar.getInstance()。有时您可以调用构造函数,有时您只能通过静态方法 创建实例。

除非引擎之类的东西正在进行,否则实现中的某处可能会调用构造函数。这是一个简单的例子:

public final class CreateViaMethod {
    private final String name;

    private CreateViaMethod(String name) {
        this.name = name;
    }

    public static CreateViaMethod newInstance(String name) {
        return new CreateViaMethod(name);
    }
}

API设计器可能想要执行此操作的原因有多种。例如,可能有几个“创建”方法具有相同的参数类型,但名称不同,例如

public static Duration fromSeconds(int seconds)
public static Duration fromMinutes(int minutes)
public static Duration fromHours(int hours)

...你不能有三个重载的构造函数,但你可以给方法不同的名称。

答案 1 :(得分:2)

这是一个初学者问题,但非常好。让我给你一个总答案。

我们假设你有MyClass,就像这样:

public class MyClass {

    public MyClass() {} //constructor

    public static MyClass generateMyClass() {
        return new MyClass();
    }

}

您可以使用MyClass.generateMyClass()创建MyClass实例并将其返回:

MyClass myClassInstance = MyClass.generateMyClass();

Toast.makeText也是如此。阅读更多here

答案 2 :(得分:0)

因为Toast.makeText()是一个返回Toast对象的静态方法。

Toast - Android Developers