为什么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开发者