4

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);
   }

}

4

7 回答 7

19

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

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}
于 2009-01-01T19:43:23.683 回答
15

“返回静态方法”是什么意思?在我看来,从实例方法调用静态方法很好 - 当然取决于具体情况。您能否发布一些 Netbeans 抱怨的代码?

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

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

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

在我看来,新线程似乎被要求休眠——类似于调用suspend. 但是不行——你只能让当前正在执行的线程休眠,这就是为什么Thread.sleep是静态方法。上面的代码是合法的 Java,并且会在新创建的线程(可能)运行时使当前正在执行的线程休眠一秒钟......根本不是代码乍一看的样子。

于 2009-01-01T19:28:57.147 回答
1

你的顺序是不是颠倒了?如果是这样,那么您不能从静态方法访问非静态方法是有道理的。如果没有,我也想知道为什么这很糟糕!

于 2009-01-01T19:29:04.290 回答
0

不能从静态上下文中引用非静态方法。静态方法可以从非静态上下文中引用。

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

于 2009-01-01T19:43:37.320 回答
0

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

正是这种间接性和与常规方法的区别令人不悦。最好直接表示为Calendar.getInstance().

于 2009-01-01T20:51:23.750 回答
0

为什么不简单解释:

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

如果您调用静态方法: 1)您将其称为 Class.method;

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

于 2013-05-16T07:58:11.943 回答
-1

在java中,所有的静态成员变量都会先被加载到内存中,然后所有的静态成员会被加载,然后非静态变量和成员函数会被加载到内存中,然后会执行静态主块...... . 所以它给出了一个非.......

于 2010-07-29T05:20:29.257 回答