在java中的静态方法,我可以以非静态方式访问静态方法吗?
我认为我的代码有问题,以静态方式或以非静态方式调用(在setIstance
中)方法isSameMonth()
是否一样? 编译器建议我改变:timesheet.isSameMonth()
到Timesheet.isSameMonth()
在java中的静态方法,我可以以非静态方式访问静态方法吗?
我觉得没什么,因为我想通过当地变量timesheet
,是同样的事情,或者我应该修改我的密码?
时间表类:
static private Timesheet timesheet;
static public Timesheet getIstance()
{
if (timesheet == null || !Timesheet.isSameMonth())
{
timesheet = null;
timesheet = new Timesheet();
}
return timesheet;
}
static public void setIstance(Timesheet timesheet)
{
if (timesheet != null && timesheet.isSameMonth())
{
Timesheet.timesheet = timesheet;
}
}
public static boolean isSameMonth()
{
Date now = new Date();
Calendar calendarNow = Calendar.getInstance();
calendarNow.setTime(now);
Date firstDay = timesheet.days[0];
Calendar calendarFirstDay = Calendar.getInstance();
calendarFirstDay.setTime(firstDay);
if (calendarNow.get(Calendar.MONTH) == calendarFirstDay.get(Calendar.MONTH))
{
return true;
}
return false;
}
从外面我做这样的判断:
Gson gson = new Gson();
String json = sharedPrefs.getString("timesheet", "");
if (!json.isEmpty())
{
try
{
Timesheet timesheet = Timesheet.getIstance();
if (timesheet.getDay(0)==null)
{
Timesheet.setIstance(gson.fromJson(json, Timesheet.class));
}
refreshWidget(timesheet, context, allWidgetIds, intent.getAction());
}
catch (Exception e)
{
Log.e(TAG_LOG, e.toString());
}
}
,你问这个问题应该让你思考设计的事实。如果每个用法都与保存的实例连接,我看不出为什么isSameMonth应该是一个静态方法。
没有严格的答案,主题中的问题,但显然它帮助
它仍然可以正常工作,但习惯上是指通过类名静态方法:
Timesheet.isSameMonth()
这使得清楚的人读取哟你正在调用一个静态方法的代码。
不需要改变你的代码,除了方法调用风格Timesheet.isSameMonth()
。
由于这是一个静态方法,所以方便地调用方法的样式是使用Class name而不是实例变量。
否则,阅读代码的人可能会认为它是实例方法。这就是IDE为了让大家生活变得轻松的建议。
timesheet
不是局部变量,它是类的静态字段。而且您的IDE建议您将timesheet.isSameMonth()
更改为Timesheet.isSameMonth()
,因为该方法是静态的,最好以该静态方式访问它。
如果timesheet
不会是一成不变的,你就已经得到另一个编译错误说,静态isSameMonth()
不能访问非静态变量。
访问一个静态方法的工作方式是:通过类名和通过实例引用,但会生成相同的代码。即使基准是null
你甚至可以访问静态方法:
Runtime r = null;
r.getRuntime(); // This works even though r is null
但是,如果我打电话Timesheet.isSameMonth()我使用Gson对象,我传递给Timesheet.setIstance(gson.fromJson(json,Timesheet.class)); ? – Accollativo 2014-09-01 11:32:55
编辑我的答案。 'timesheet.isSameMonth()'和'Timesheet.isSameMonth()'在生成的字节码中是相同的。 – icza 2014-09-01 11:36:14
不是一个答案,但是 - 事实上你问这个问题应该让你思考的设计。如果每个用法都与保存的实例连接,我看不出为什么isSameMonth应该是一个静态方法。 – Deltharis 2014-09-01 11:34:17
isSameMonth是静态的,因为我在getIstance中调用它是一个静态方法。 但你说得对,我可以改变它:\t \t if(timesheet == null ||!timesheet.isSameMonth())并把isSameMonth设置为非静态。 你的回复是最好的答案,谢谢:) – Accollativo 2014-09-01 11:42:52
如果你的回复是答案我会接受的 – Accollativo 2014-09-01 14:01:34