在java中的静态方法,我可以以非静态方式访问静态方法吗?

时间:2014-09-01 11:26:56

标签: java static static-methods

我认为我的代码中出现了问题,以静态方式或非静态方式调用(setIstance)方法isSameMonth()是否相同? 编译器建议我将timesheet.isSameMonth()更改为Timesheet.isSameMonth()

我认为不是,因为我想传递本地变量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());
    }
}

4 个答案:

答案 0 :(得分:2)

它可以工作,但惯例是通过类名引用静态方法:

Timesheet.isSameMonth()

这使得读取您的代码的人明白您正在调用静态方法。

答案 1 :(得分:1)

没有。除了调用样式Timesheet.isSameMonth()的方法之外,无需更改代码。

由于这是一个静态方法,因此方便调用方法的方式是使用类名而不是实例变量。

否则,阅读代码的人可能会认为它是一种实例方法。这就是为什么IDE建议让每个人都轻松生活。

答案 2 :(得分:1)

timesheet不是局部变量,它是类的静态字段。并且您的IDE建议您将timesheet.isSameMonth()更改为Timesheet.isSameMonth(),因为该方法是静态的,最好以(静态)方式访问它。

如果timesheet不是静态的,那么你就会得到另一个编译错误,说静态isSameMonth()无法访问非静态变量。

访问静态方法有两种方式:通过类名和实例引用,但将生成相同的代码。即使引用为null

,您甚至可以访问静态方法
Runtime r = null;
r.getRuntime(); // This works even though r is null

答案 3 :(得分:1)

您提出这个问题应该让您考虑设计。如果每个用法都与保留的实例相关联,我认为isSameMonth不应该是一个静态方法。

不严格地回答主题中的问题,但显然有帮助