Методи виклику від основного

У мене виникла проблема з викликом методу. Наприклад, я хочу, щоб наступна програма мала два способи:

  • Перший - перевірити, чи є щорічний стрибок чи ні,
  • другий показувати кількість днів у місяці

Я не можу викликати методи в main .

import java.util.Scanner;

public class LeapYearCheck {

    public static void main(String[] args) {
        LeapYearCheck ob = new LeapYearCheck();
        ob.isLeapYear();
        ob.daysInMonth();
    }

    static void isLeapYear() {
        Scanner input = new Scanner(System.in);
        int month = input.nextInt();
        System.out.println("Enter a year: ");
        int year = input.nextInt();
        if (year % 4 == 0 || year % 400 == 0) {
            System.out.println(year + " is leap year:");
        } else {
            System.out.println(year + " is not leap year:");
        }
    }

    static void daysInMonth() {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a month :");
        int month = input.nextInt();
        int year = 0;
        if (month == 2) {
            System.out.println("There are 29 days in February: " + year + " year");
        } else if (month == 1) {
            System.out.println("The are 31 days in January " + year + " year");
        } else if (month == 2) {
            System.out.println("The are 28 days in February " + year + " year");
        } else if (month == 3) {
            System.out.println("The are 31 days in March " + year + " year");
        } else if (month == 4) {
            System.out.println("The are 30 days in April  " + year + " year");
        } else if (month == 5) {
            System.out.println("The are 31 days in May " + year + " year");
        } else if (month == 6) {
            System.out.println("The are 30 days in June  " + year + " year");
        } else if (month == 7) {
            System.out.println("The are 31 days in July  " + year + " year");
        } else if (month == 8) {
            System.out.println("The are 31 days in August " + year + " year");
        } else if (month == 9) {
            System.out.println("The are 30 days in September  " + year + " year");
        } else if (month == 10) {
            System.out.println("The are 31 days in  October " + year + " year");
        } else if (month == 11) {
            System.out.println("The are 30 days in November " + year + " year");
        } else if (month == 12) {
            System.out.println("The are 31 days in December " + year + " year");
        } else {
            System.out.println("Invalid Month, Please enter a number between 1 & 12 Merci: ");
        }
    }
}
0
Методи повторно оголошені статичними! Просто називайте їх таким, як це daysInMonth() . Вам не потрібен об'єкт!
додано Автор Mob, джерело
Яка помилка/виняток ви отримуєте?
додано Автор Azodious, джерело
Так, я не бачу проблем. Хоча ви повинні зробити методи загальнодоступними/захищеними/приватними, або НЕ робити їх статичними, або НЕ створювати об'єкт для виклику цих методів (статичні методи слід викликати статичним способом, і оскільки ви перебуваєте в тому ж класі, що означатиме лише дзвінки їх безпосередньо, немає потреби в екземплярі). О, і звичайно, ваш розрахунок, чи це високосний рік чи ні, фактично не правильний, але це не спричиняє програму провалу.
додано Автор Thor84no, джерело
Що саме така проблема? Програма працює досить добре для мене (хоча є і деякі логічні помилки)
додано Автор Philipp Reichart, джерело
Ну, крім непотрібного створення об'єкта, що не так?
додано Автор amal, джерело
Ум, ваша проблема, що перший рік, коли ви ввели, не відображається у другій виписці?
додано Автор amal, джерело
вибачте про це і приятельський товариш; /
додано Автор Kiril, джерело
Вітаю Філіппа Я ціную це
додано Автор Kiril, джерело
Наприклад, спочатку вам потрібно ввести номер, а потім просити вас ввести рік, а в кінці з'явиться відображення "0 рік" "1 Введіть рік: 400 400 - високосний рік: Введіть місяць: 5 Є 31 дні в Травень 0 року "будь-який ідеал?
додано Автор Kiril, джерело

3 Відповіді

Методи оголошені "статичними". У Java це означає, що метод доступний для класу , а не для об'єктів класу.

Щоб бути ясним: я розумію, що ваша проблема полягає в тому, що, викликаючи другий метод, рік з першого методу більше не доступний, чи не так?

Це тому, що ви не зберігаєте його в змінній екземпляра, а в локальній змінній для методу. Локальні змінні відсутні, коли метод завершено. Замість цього створіть змінну екземпляра для свого класу, наприклад, "приватний рік"; У першому методі використовуйте "this.year = ...", щоб призначити значення для змінної. У другому методі використовуйте "цей.рік" для доступу до нього.

5
додано
Дякую Isinger!
додано Автор Kiril, джерело

Ваш код буде компілюватися і запускатися (я просто пробував), але ви не повинні викликати статичні методи за допомогою таких виразів:

LeapYearCheck ob = new LeapYearCheck();
ob.isLeapYear();
ob.daysInMonth();

Ви повинні або зробити ці приклади методів або називати їх статичними методами, за бажанням кваліфікуючи їх за назвою типу:

LeapYearCheck.isLeapYear();//Explicit
daysInMonth();//Implicit

Використання статичних методів як методів екземпляра призводить до плутанини - він виглядає , як він залежить від екземпляра, але це не так.

Наступна дивність тут:

static void isLeapYear() {
    Scanner input = new Scanner(System.in);
    int month = input.nextInt();
    System.out.println("Enter a year: ");

Ви чекаєте на введення користувача, але не повідомляєте користувачеві, чому - і ви в будь-який час ігноруєте місяця (що має сенс, оскільки це не має значення для розробки, чи є рік високим роком чи ні). Просто позбутися цієї лінії:

int month = input.nextInt();

Крім того, ця логіка порушена:

if (month == 2) {
    System.out.println("There are 29 days in February: " + year + " year");
} else if (month == 1) {
    System.out.println("The are 31 days in January " + year + " year");
} else if (month == 2) {
    System.out.println("The are 28 days in February " + year + " year");

Тоді для методу daysInMonth :

  • Ви не питаєте про рік
  • Ви не намагаєтеся виявити високі роки, перш ніж повідомляти про те, що в лютому було 29 днів

Насправді, цей код трохи неприємний, але ваша проблема не в змозі викликати методи з main , якщо не є проблемою ...

РЕДАГУВАТИ: як зазначалося, розрахунки високого року в будь-якому випадку є неправильними - я припускаю, що календарна сторона речей є частиною мети здійснення, але зазвичай краще використовувати Календар (та його підкласи) або Час роботи Joda , щоб почати.

4
додано
@Kiril: Ну, це говорить про те, що виклики є основним методом, але все одно це неправильно. Важливо розуміти, що означає static - я пропоную вам прочитати книгу або підручник дуже ретельно .
додано Автор Jon Skeet, джерело
@ Thor84no: Так, також :)
додано Автор Jon Skeet, джерело
Це хороша відповідь, я просто хотів би додати, що, перевіряючи дату подібних даних, він, можливо, має задуматися про використання календаря (швидше за все GregorianCalendar), а не (неправильного) тестування вручну, яке він робить зараз. GregorianCalendar представляє вам метод isLeapYear.
додано Автор Thor84no, джерело
@Kiril Головне зрозуміти це різниця між об'єктом та класом . Статичні методи відносяться до класів, а нестатистичні методи відносяться до об'єктів. Об'єкти - це окремі приклади класу, у вашому випадку LeapYearCheck - це ваш клас, а ob - це ваш об'єкт.
додано Автор Thor84no, джерело
Ну, я був талановитим, що коли основний mathod є статичним, його можна отримати лише за допомогою інших статичних методів, чи не так?
додано Автор Kiril, джерело

Це має бігти. Може бути, неправильно, але він буде працювати. Можливо, ви посилаєтеся на попередження, яке ви отримуєте за двома способами викликів у вашому основному способі. Ви бачите, ваші два методи є статичними. Статичний метод не вимагає виклику екземпляра об'єкта. Тим не менше, ви викликаєте їх на екземпляр LeapYearCheck. Це дозволено (це буде делегувати належному класу), просто не потрібно.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників