有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java调用静态方法的实例

你好

我有点困惑。我想使用日历,因此我在internet上搜索了它,并遇到以下代码:

Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);

但我了解到这是一种静态方法:

Calendar.getlnstance();

如果调用的方法是静态的,我怎么能得到Calendar(抽象类)的实例呢

我真的很想了解它。所以下次我还可以创建一个静态方法来创建一个实例

多谢各位


共 (5) 个答案

  1. # 1 楼答案

    这是静态工厂法。方法就是调用构造函数并返回构造的对象的方法。 {}的主体可能是这样的:

    return new SomeCalendar(now);
    

    其中SomeCalender抽象类Calendar的具体实现。其中的一些优点是:您不必关心底层类(据您所知,它只是一个日历),底层实现可以在不影响您的情况下进行更改(例如,代码可以更改为return new AnotherCalendar(),您不必更改代码中的任何内容)

    因为它是一个静态方法,所以可以对类型本身(Calendar.getInstance();)调用它,而不是对该类型的实例(Calendar c = ...; c.getInstance();)调用它

  2. # 2 楼答案

    工厂方法是静态的这一事实并不意味着日历是静态的——它只是提供了一种创建日历的访问机制

    查看这篇关于如何自己使用此模式的帖子: http://today.java.net/pub/a/today/2005/03/09/factory.html

    它还进一步解释了模式背后的原则

    不过,我支持阅读有效Java的建议——这是一本很棒的书,尽管它已经过时了

  3. # 3 楼答案

    Java到处都在做这种事情。看看XMLAPI

    这是一种在Calendar系统中维护单个接口的方法,即使底层实现发生了更改。是的,该方法是一个工厂方法,但是,其他一些答案似乎忽略了一点,即它可以返回Calendar的不同实现

    这就是日历可以返回的方式,即使它是抽象的。过度简化的getInstance()实现可以是

    Calendar getInstance()
    {
        return new GregorianCalendar();
    }
    

    getInstance()的调用者不需要知道实现类型就可以获得当前日期和时间

    我建议浏览一下OpenJDK

  4. # 4 楼答案

    实例方法要求您已有一个实例来调用该方法

    静态并不意味着不能将实例作为参数、返回实例作为结果或创建实例。这仅仅意味着可以在没有实例的情况下调用该方法,并且在该方法中没有this之类的东西

    您通常不希望这种工厂方法成为实例方法(非静态),因为这意味着您需要已有一个实例才能创建新的实例。您将如何创建第一个

    (确实存在非静态工厂方法,但它们更常用于创建不同类型的对象。例如,生成器或工厂类通常会有一个创建其他类实例的方法。)

  5. # 5 楼答案

    这是在java中创建新对象的另一种方法。传统上,构造函数是一种选择,但是由于使用静态工厂有一些优势,因此它比普通的构造函数更受欢迎

    您应该真正学习Joshua Bloch的高效Java。这是书中的第一项。承包商优先选择静态工厂。他提到的优点是:

    因为静态工厂的名称可能是描述性的

    2_uu然后可以使其返回任何子类型,而不仅仅是特定类的类型

    3\您可以在工厂方法中处理缓存和单例等概念。(您不必盲目地创建新对象)

    4\减少初始化代码。例如,我们可以有一个类似getStringList()的方法,而不是List newList=newArrayList

    第四个优点我不是很特别,但我看到Google Guava框架已经实现了它。请把书拿起来。它是最好的java编程书籍之一