2

I know how to work with objects.. but one thing in particular has me scratching my head.
Static methods.

I'll give an example.

Toolkit theKit = Toolkit.getDefaultToolkit(); 

I think that the theKit object now holds new Toolkit(); class.. but im not sure.

Furthermore I can do theKit.getScreenResolution(); now with theKit reference variable.

Is that because Thetoolkit class it self contains that method?

Forgive me, now that I wrote it all out it seems obvious but ill ask anyway. Thank you.

4

6 回答 6

5

static方法属于类。不是实例。
所有static成员变量也是如此。
因此,您无需创建对象的实例即可使用该方法。由于它属于该类,您只需通过类名访问它。
方法的常见用法static是实用方法。您不使用对象(并且在您的类层次结构设计中存在具体对象可能没有意义),因此您通过类访问该方法

于 2013-04-17T12:06:04.060 回答
1

我可以有一个确实创建类实例的静态方法。静态方法不属于实例,而是属于类本身,因此您无需拥有类的实例即可使用其静态方法。简单的例子:

public class MyClassExample(){

public static MyClassExample getDefaultInstance(){
 return new MyClassExample();
}

}

然后你可以用这种方式实例化 MyClassExample:

MyClassExample example = MyClassExample.getDefaultInstance();
于 2013-04-17T12:09:41.160 回答
1
Toolkit theKit = Toolkit.getDefaultToolkit(); 

上一行是factory获取 Class 实例和getDefaultToolkit()是一个工厂方法,它显然是一个静态方法(所以你直接使用类名调用),它将返回类的实例(在你的情况下它是 Toolkit 类) .我们也在单例的情况下使用这种技术。

关于您的问题,是的,因为该类包含方法 getScreenResolution(),因此您可以调用它,这很明显。

于 2013-04-17T12:09:42.437 回答
1

Toolkit.getDefaultToolkit()是获取 ToolKit 类实例的静态工厂辅助方法。'theKit' 是一个有效的实例,您可以像使用 new 创建对象实例时一样使用它。正如有效的 Java 书籍“考虑静态工厂方法而不是构造函数”中提到的那样,拥有这样的辅助方法是最佳实践

于 2013-04-17T12:10:08.077 回答
1

该方法意味着您不需要类的实例化对象getDefaultToolkit()来访问此方法。当 JVM 知道该类时,它就在那里,并且可以随时访问静态方法。这是因为他们永远不会改变!他们不会改变他们的状态,他们永远不会做其他事情,而是在这种情况下返回一个对象。staticToolkitToolkit

我在这里说了。在内部,我猜测该方法Toolkit.getDefaultToolkit()会执行以下操作:

public Toolkit getDefaultToolkit(){
   return new Toolkit();   
}

好吧,这太容易了,但是在该静态方法中的某个地方将创建并返回一个对象。

所以之后你的变量theKid实际上持有对真实的引用 Object。一个非静态实例,可以更改和执行操作.. 例如,它可以为您提供当前屏幕theKit.getScreenResolution()分辨率..不仅仅是分辨率.. 而是精确的分辨率(每个设备上的每个屏幕都会发生变化) – 意味着此方法不能是静态的,但需要一个对象。

于 2013-04-17T12:11:38.783 回答
1

这是一种设计模式。现在考虑到这种情况,有必要Toolkit保持单例。所以库设计者确保它本身保持单例,提供一个方法来getDefaultToolkit.

getDefaultToolkit返回一个Toolkit可供图书馆用户使用的。

现在为了提供对这种方法的访问,假设不能通过Toolkit“new Toolkit()”进行初始化,库提供了一个静态方法,可以访问它

于 2013-04-17T12:07:27.360 回答