2015-05-09 5 views
2

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

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. Однако, когда я пытаюсь ссылаться на него в моем главном классе ...

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

Заранее благодарен!

+2

'static' не означает, что параметр метода может измениться, это означает, что поля/методы относятся к классу, а не к экземпляру класса. Таким образом, вы должны сделать свой метод здесь 'static'. – Jyr

ответ

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); 

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

2

Метод для этого нестационарен, поскольку изменяется дата2 int.

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

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

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

(В отличие от этого не совсем ясно, что ваш метод предназначен для достижения - вас действительно интересует день года? Также вероятно, что java.time или Joda Time предоставят лучший API для этого. наиболее важно, чтобы вы поняли, что static значит ... вы можете прочитать Java tutorial on class members.)

1

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

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) 
1

Метод для этого не является статичным, как date2 int изменяется. Статическая переменная - это та, которая разделяется между всеми экземплярами класса.

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

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

Когда вы объявляете ваш метод, вы можете сделать его статическим, добавив «статический» ключевое слово в объявлении метода, как это:

public static int getDaysBetween(int date2){} 

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

message = "Days bewteen: " + new Date().getDaysBetween(date2); 
Смежные вопросы