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);
}
}
答案 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中,所有静态成员变量将首先加载到内存中, 然后将加载所有静态成员, 之后,非静态变量和成员函数将被加载到内存中, 之后静态主程序段将被执行....... 所以它给出的错误是非..............