在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()); 
    } 
} 
+2

不是一个答案,但是 - 事实上你问这个问题应该让你思考的设计。如果每个用法都与保存的实例连接,我看不出为什么isSameMonth应该是一个静态方法。 – Deltharis 2014-09-01 11:34:17

+0

isSameMonth是静态的,因为我在getIstance中调用它是一个静态方法。 但你说得对,我可以改变它:\t \t if(timesheet == null ||!timesheet.isSameMonth())并把isSameMonth设置为非静态。 你的回复是最好的答案,谢谢:) – Accollativo 2014-09-01 11:42:52

+0

如果你的回复是答案我会接受的 – Accollativo 2014-09-01 14:01:34

,你问这个问题应该让你思考设计的事实。如果每个用法都与保存的实例连接,我看不出为什么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 
+0

但是,如果我打电话Timesheet.isSameMonth()我使用Gson对象,我传递给Timesheet.setIstance(gson.fromJson(json,Timesheet.class)); ? – Accollativo 2014-09-01 11:32:55

+0

编辑我的答案。 'timesheet.isSameMonth()'和'Timesheet.isSameMonth()'在生成的字节码中是相同的。 – icza 2014-09-01 11:36:14