为什么从非静态方法访问静态方法不好?

时间:2009-01-01 19:20:15

标签: java oop static methods

Netbeans告诉我从非静态方法访问静态方法是不好的。为什么这么糟糕? “访问静态方法getInstance”是警告:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}

7 个答案:

答案 0 :(得分:18)

您可能正在从实例而不是直接访问静态方法。请尝试使用Calendar.getInstance()

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}

答案 1 :(得分:15)

“返回静态方法”是什么意思?可以在我的视图中从实例方法调用静态方法 - 当然,这取决于具体情况。你能发布一些Netbeans抱怨的代码吗?

可以想象的一件事是,如果你只使用实例方法中的静态方法,而不使用实例的任何数据。有时这是实现接口或从基类覆盖方法所需要的,但是如果你没有覆盖任何东西并且你没有使用任何实例变量,那么让方法静态以表明它确实不是很好取决于特定的实例。

编辑:通过编辑的问题,这很有道理。 IMO是Java的一个缺陷,它首先允许它。它可能会产生非常误导性的代码。我最喜欢的例子(这意味着老人可能已经看到我之前发布:)是Thread.sleep。像这段代码那样看起来是什么?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

在我看来,似乎要求新线程休眠 - 类似于对suspend的调用。但是没有 - 你只能要求当前正在执行的线程休眠,这就是Thread.sleep是静态方法的原因。上面的代码是合法的Java,并且会使当前正在执行的线程在新创建的线程(可能)运行时暂停一段时间......根本不是代码看起来像乍看之下。

答案 2 :(得分:1)

你的订单是否已被撤销?如果是这样,则无法从静态方法访问非静态方法。如果没有,我想知道为什么这也很糟糕!

答案 3 :(得分:0)

无法从静态上下文引用非静态方法。可以从非静态上下文引用静态方法。

是Netbeans错误还是警告?你可以发布导致它的代码吗?

答案 4 :(得分:0)

调用time.getInstance()就好了。在这种情况下,编译器将查看变量的类型Calendar,并在那里调用该方法。它最终被编译为Calendar.getInstance()。请注意,time的实际值对此没有贡献,即它甚至可以是null并且无关紧要。

这是与常规方法的间接和差异,这是不赞成的。最好直接表达为Calendar.getInstance()

答案 5 :(得分:0)

为什么不解释简单:

如果你叫非静态方法, 1)使用= new Class()创建新实例; 2)然后调用方法a.method;

如果你调用静态方法: 1)你称之为Class.method;

你可以使用静态方法,因为它在类中是独立的,并且具有调用所需的全部功能。如果它依赖于其他一些信息(作为构造函数),你不会将它声明为静态,它将失败。

答案 6 :(得分:-1)

在java中,所有静态成员变量将首先加载到内存中,   然后将加载所有静态成员,   之后,非静态变量和成员函数将被加载到内存中,   之后静态主程序段将被执行....... 所以它给出的错误是非..............