java调用静态方法的实例
你好
我有点困惑。我想使用日历,因此我在internet上搜索了它,并遇到以下代码:
Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);
但我了解到这是一种静态方法:
Calendar.getlnstance();
如果调用的方法是静态的,我怎么能得到Calendar(抽象类)的实例呢
我真的很想了解它。所以下次我还可以创建一个静态方法来创建一个实例
多谢各位
你可以在下面搜索框中键入要查询的问题!
你好
我有点困惑。我想使用日历,因此我在internet上搜索了它,并遇到以下代码:
Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);
但我了解到这是一种静态方法:
Calendar.getlnstance();
如果调用的方法是静态的,我怎么能得到Calendar(抽象类)的实例呢
我真的很想了解它。所以下次我还可以创建一个静态方法来创建一个实例
多谢各位
# 1 楼答案
这是静态工厂法。方法就是调用构造函数并返回构造的对象的方法。 {}的主体可能是这样的:
其中
SomeCalender
是抽象类Calendar
的具体实现。其中的一些优点是:您不必关心底层类(据您所知,它只是一个日历),底层实现可以在不影响您的情况下进行更改(例如,代码可以更改为return new AnotherCalendar()
,您不必更改代码中的任何内容)因为它是一个静态方法,所以可以对类型本身(
Calendar.getInstance();
)调用它,而不是对该类型的实例(Calendar c = ...; c.getInstance();
)调用它# 2 楼答案
工厂方法是静态的这一事实并不意味着日历是静态的——它只是提供了一种创建日历的访问机制
查看这篇关于如何自己使用此模式的帖子: http://today.java.net/pub/a/today/2005/03/09/factory.html
它还进一步解释了模式背后的原则
不过,我支持阅读有效Java的建议——这是一本很棒的书,尽管它已经过时了
# 3 楼答案
Java到处都在做这种事情。看看XMLAPI
这是一种在
Calendar
系统中维护单个接口的方法,即使底层实现发生了更改。是的,该方法是一个工厂方法,但是,其他一些答案似乎忽略了一点,即它可以返回Calendar
的不同实现这就是日历可以返回的方式,即使它是抽象的。过度简化的
getInstance()
实现可以是getInstance()
的调用者不需要知道实现类型就可以获得当前日期和时间我建议浏览一下OpenJDK
# 4 楼答案
实例方法要求您已有一个实例来调用该方法
静态并不意味着不能将实例作为参数、返回实例作为结果或创建实例。这仅仅意味着可以在没有实例的情况下调用该方法,并且在该方法中没有
this
之类的东西您通常不希望这种工厂方法成为实例方法(非静态),因为这意味着您需要已有一个实例才能创建新的实例。您将如何创建第一个
(确实存在非静态工厂方法,但它们更常用于创建不同类型的对象。例如,生成器或工厂类通常会有一个创建其他类实例的方法。)
# 5 楼答案
这是在java中创建新对象的另一种方法。传统上,构造函数是一种选择,但是由于使用静态工厂有一些优势,因此它比普通的构造函数更受欢迎
您应该真正学习Joshua Bloch的高效Java。这是书中的第一项。承包商优先选择静态工厂。他提到的优点是:
因为静态工厂的名称可能是描述性的
2_uu然后可以使其返回任何子类型,而不仅仅是特定类的类型
3\您可以在工厂方法中处理缓存和单例等概念。(您不必盲目地创建新对象)
4\减少初始化代码。例如,我们可以有一个类似getStringList()的方法,而不是List newList=newArrayList
第四个优点我不是很特别,但我看到Google Guava框架已经实现了它。请把书拿起来。它是最好的java编程书籍之一