非静态方法参考?

时间:2015-05-09 19:48:28

标签: java methods reference non-static

我为了好玩而做的一个小小的项目涉及从用户给出的未来日期中减去当前日期以返回它们之间的日期。

public int getDaysBetween(int date2)
{
    //Subtract current date from future date (date2), leaving the number of days between them
    int getDaysBetween = 0;
    Calendar myCalendar = Calendar.getInstance();
    myCalendar.get(Calendar.DAY_OF_YEAR); 
    getDaysBetween = date2-Calendar.DAY_OF_YEAR;
    return getDaysBetween;
}

执行此操作的方法是非静态的,因为date2 int更改。但是,当我尝试在我的主课程中引用它时......

//Figure out a non-static reference
    int date2 = Integer.parseInt(JOptionPane.showInputDialog("Enter a day in the year ahead of today"));
    message = "Days bewteen: " + Date.getDaysBetween(date2-Calendar.DAY_OF_YEAR);
    JOptionPane.showMessageDialog(null, message);

我得到的错误是无法从静态上下文中引用非静态方法。

我对Java很新,所以对大多数人来说似乎很容易,但我可以使用帮助。

提前致谢!

4 个答案:

答案 0 :(得分:2)

  

执行此操作的方法是非静态的,因为date2 int更改。

我认为您误解了static修饰符的含义。

您的方法不使用任何实例字段,并且没有理由在子类中覆盖它,因此它应该是一个静态方法。

date2参数,因此每次调用它都可以传递不同的值。这并不取决于您调用方法的实例。

(顺便说一句,它并不是很清楚你的方法意味着什么 - 你真的对一年中的某一天感兴趣吗?它也可能是java.time或Joda Time会为此提供更好的API。但是, 重要的是,您了解static的含义...您可能希望阅读Java tutorial on class members。)

答案 1 :(得分:1)

您的方法似乎打算返回date2减去当前DAY_OF_YEAR(不减去DAY_OF_YEAR常量)。如果你成功static,那么你就不需要像

那样的实例
public static int getDaysBetween(int date2) {
    return date2 - Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
}

假设这是您自己的Date课程,那么要将其设为非static(或instance级别),您需要在类似

的实例上调用它
message = "Days bewteen: " + new Date().getDaysBetween(date2);

但如果它是static,那么你可以使用

message = "Days bewteen: " + Date.getDaysBetween(date2);

最后,请不要为您的班级Date命名(JRE至少包含两个名称为java.sql.Datejava.util.Date的班级。)

答案 2 :(得分:1)

该方法不是静态的。这意味着您必须拥有该类的实例才能使用该函数。 E.g:

Date date = new Date(); // Create an instance of the Date class
date.getDaysBetween(...); // The method call is related to the instance

您正在尝试将方法调用为静态方法。静态方法不需要类的实例。相反,它本身就是一个类的特征。这个如果你想执行这样的静态方法调用:

Date.getDaysBetween(...);

您需要声明方法static:

public static int getDaysBetween(int date2)

答案 3 :(得分:1)

  

执行此操作的方法是非静态的,因为date2 int更改。   静态变量是在类的所有实例之间共享的变量。

静态方法是一种可以在不需要在类上创建和实例的情况下调用的方法。

无法更改的变量称为常量,并使用关键字“final”声明。

当您声明方法时,可以通过在方法声明中添加“static”关键字使其成为静态,如下所示:

public static int getDaysBetween(int date2){}

否则,您可以保持方法非静态,但在这种情况下,要调用它,您必须创建一个类的实例,然后在该实例上调用方法:

 message = "Days bewteen: " + new Date().getDaysBetween(date2);