为什么Toast可以在没有new关键字的情况下实例化?
所以对于Toast类,它显然可以像这样写:
Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT) toastMessage.show();
为什么toastMessage可以实例化并用作没有new关键字的对象?
如何通过方法实例化toastMessage?
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)
…你不能有三个重载的构造函数,但你可以给方法不同的名称。
这是一个初学者的问题,但是相当不错。 让我给你一个总答案。
让我们假设您有MyClass
,如下所示:
public class MyClass { public MyClass() {} //constructor public static MyClass generateMyClass() { return new MyClass(); } }
您可以使用MyClass.generateMyClass()
创建一个MyClass
实例并返回它:
MyClass myClassInstance = MyClass.generateMyClass();
Toast.makeText
。 在这里阅读更多。
因为Toast.makeText()是一个返回Toast对象的静态方法。
Toast – Android开发者