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); }
}
您可能正在从实例而不是直接访问静态方法.请尝试使用Calendar.getInstance()
:
private String getSystemTime() { return Calendar.getInstance().get(Calendar.HOUR)+":"+ Calendar.getInstance().get(Calendar.MINUTE); }
"返回静态方法"是什么意思?可以在我的视图中从实例方法调用静态方法 - 当然,这取决于具体情况.你能发一些Netbeans抱怨的代码吗?
我能想象的一件事是,如果你只使用实例方法中的静态方法,而不使用实例的任何数据.有时这是实现接口或从基类覆盖方法所需要的,但是如果你没有覆盖任何东西并且你没有使用任何实例变量,那么让方法静态以表明它确实不是很好取决于特定的实例.
编辑:通过编辑的问题,这很有道理.IMO是Java的一个缺陷,它首先允许它.它可能会产生非常误导性的代码.我最喜欢的例子(这意味着老人可能已经看到我之前发布它:)是Thread.sleep
.这段代码看起来像什么?
Thread t = new Thread(someRunnable); t.start(); t.sleep(1000);
在我看来,看起来新线程被要求睡觉 - 类似于呼叫suspend
.但是没有 - 你只能要求当前正在执行的线程休眠,这就是Thread.sleep
静态方法的原因.上面的代码是合法的Java,并且会使当前正在执行的线程在新创建的线程(可能)运行时暂停一段时间......根本不是代码看起来像乍看之下.