【问题标题】:Non-static method reference?非静态方法参考?
【发布时间】:2015-05-09 19:48:27
【问题描述】:

我一直在做一个有趣的小项目,涉及从用户给出的未来日期中减去当前日期以返回它们之间的天数。

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 的新手,所以对你们大多数人来说可能看起来很容易,但我可以使用帮助。

提前致谢!

【问题讨论】:

  • static 并不意味着方法参数可以改变,它意味着字段/方法属于类,而不是类的实例。因此,你应该在这里static.

标签: java methods reference non-static


【解决方案1】:

执行此操作的方法是非静态的,因为 date2 int 会发生变化。

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

你的方法不使用任何实例字段,也没有理由在子类中重写它,所以它应该是一个静态方法。

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

(顺便说一句,您的方法要实现的目标并不是很清楚 - 您真的对一年中的哪一天感兴趣吗?java.time 或 Joda Time 也可能会为此提供更好的 API。但是, 重要的是您了解static 的含义...您可能想阅读Java tutorial on class members。)

【讨论】:

    【解决方案2】:

    您的方法似乎打算返回 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 的班级)。

    【讨论】:

      【解决方案3】:

      该方法不是静态的。这意味着您必须有一个类的实例才能使用该函数。例如:

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

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

      Date.getDaysBetween(...);
      

      您需要将方法声明为静态:

      public static int getDaysBetween(int date2)
      

      【讨论】:

        【解决方案4】:

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

        静态方法是无需在类上创建实例即可调用的方法。

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

        当你声明你的方法时,你可以通过在方法声明中添加一个“静态”关键字来使其成为静态:

        public static int getDaysBetween(int date2){}
        

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

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

        【讨论】:

          猜你喜欢
          • 2016-01-21
          • 1970-01-01
          • 2013-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多