Ссылка на нестатический метод?

Небольшой побочный проект, который я выполнял для развлечения, включает в себя вычитание текущей даты из будущей даты, заданной пользователем, чтобы получить количество дней между ними.

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, поэтому большинству из вас это может показаться простым, но мне не помешала бы помощь.

Заранее спасибо!


person Invictus    schedule 09.05.2015    source источник
comment
static не означает, что параметр метода может измениться, это означает, что поля/методы принадлежат классу, а не экземпляру класса. Таким образом, вы должны сделать свой метод здесь static.   -  person Jyr    schedule 09.05.2015


Ответы (4)


Ваш метод, по-видимому, предназначен для возврата date2 минус текущий DAY_OF_YEAR (а не минус константа DAY_OF_YEAR). И если вы сделаете это static, вам не нужен экземпляр, например,

public static int getDaysBetween(int date2) {
    return date2 - Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
}

Предполагая, что это ваш собственный класс Date, тогда, чтобы сделать его не-7_ (или уровень instance), вам нужно будет вызвать его в экземпляре, например

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

Но если это static, вы можете использовать

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

Наконец, пожалуйста, не называйте свой класс Date (JRE включает как минимум два класса с такими именами java.sql.Date и java.util.Date).

person Elliott Frisch    schedule 09.05.2015

Метод для этого не является статическим, так как изменяется значение date2 int.

Я думаю, вы неправильно поняли значение модификатора static.

В вашем методе не используются поля экземпляра, и нет причин переопределять его в подклассах, поэтому он должен быть статическим методом.

date2 — это параметр, поэтому при каждом обращении к нему может передаваться другое значение. Это не зависит от экземпляра, для которого вы вызываете метод.

(Кроме того, не совсем понятно, для чего предназначен ваш метод — вас действительно интересует день года? Также вероятно, что java.time или Joda Time предоставят лучший API для этого. Однако наиболее важно, чтобы вы понимали, что означает static... вы можете прочитать Руководство по Java для участников класса.)

person Jon Skeet    schedule 09.05.2015

Метод не статичен. Это означает, что у вас должен быть экземпляр класса для использования функции. Например:

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)
person Atuos    schedule 09.05.2015

Метод для этого не является статическим, так как изменяется значение date2 int. Статическая переменная является общей для всех экземпляров класса.

Статический метод — это метод, который можно вызывать без необходимости создания экземпляра класса.

Переменные, которые нельзя изменить, называются константами и объявляются с ключевым словом final.

Когда вы объявляете свой метод, вы можете сделать его статическим, добавив ключевое слово «static» в объявление метода следующим образом:

public static int getDaysBetween(int date2){}

В противном случае вы можете оставить свой метод нестатическим, но в этом случае для его вызова вам нужно будет создать экземпляр класса, а затем вызвать метод для этого экземпляра:

 message = "Days bewteen: " + new Date().getDaysBetween(date2);
person Alex Shutin    schedule 09.05.2015