因此,对于Toast类,它显然可以这样写:
Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT)
toastMessage.show();
为什么toastMessage可以在没有new关键字的情况下实例化并用作对象?
如何通过方法实例化toastMessage?
答案 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对象的静态方法。