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

Java 为什么从非静态方法访问静态方法是不好的?,java,oop,static,methods,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 */

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

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

我可以想象的一件事是,如果只使用实例方法中的静态方法,而不使用实例的任何数据。有时,这是实现接口或重写基类中的方法所必需的,但如果您没有重写任何内容,也没有使用任何实例变量,则最好将方法设置为静态,以表明它确实不依赖于特定实例

编辑:对于已编辑的问题,这很有意义。在我看来,Java的一个缺陷首先允许它。它可能会产生非常误导性的代码。我最喜欢的例子是
Thread.sleep
,这意味着老前辈们可能已经看过我的帖子了。这段代码是什么样子的

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

在我看来,新线程似乎被要求睡眠-类似于调用
suspend
。但是没有-您只能要求当前正在执行的线程睡眠,这就是为什么
thread.sleep
是一个静态方法。上面的代码是合法的Java,当新创建的线程(可能)运行时,将使当前正在执行的线程休眠一秒钟。。。一点也不像代码乍一看是什么样子。

您是否颠倒了顺序?如果是这样的话,您就不能从静态方法访问非静态方法。如果不是,我想知道为什么这是坏的,以及

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

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

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


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

调用
time.getInstance()
就可以了。在本例中,编译器将查看变量的类型,
Calendar
,并在那里调用该方法。它最终完全按照
Calendar.getInstance()
编译。请注意,
time
的实际值对此没有影响,即它甚至可以是
null
,这并不重要


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

在java中,所有静态成员变量都将首先加载到内存中, 然后将加载所有静态成员, 之后,非静态变量和成员函数将加载到内存中, 之后,将执行静态主块。。。。。。。
所以它给出了一个错误,一个非………

为什么不简单解释一下:

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

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


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

谢谢您的回答,我随后阅读了访问静态方法的内容。或者,既然您似乎有一个日历实例,您可以调用
time.get(Calendar.HOUR)
…您无论如何都不能返回(静态或非静态)方法,这个问题问得很糟糕…@PhiLho,如果你能编辑这个问题,使其正确,那会很好。@Ron-你能确认你在标签列表下没有“编辑”选项吗?因为我同意PhiLho的评论,所以我会去修复它。问题是相反的-关于从非静态上下文访问静态方法的警告。Java编译器应该阻止你这样做。因为静态方法根据定义与任何实例无关,所以没有上下文可以在其中调用非静态方法,因为没有实例可以在其上调用此类方法。