Негізгі тәсілдерден қоңырау шалу әдісі

Менде әдісті шақыру мәселесі бар. Мысалы, келесі бағдарламада екі әдіс болуы керек:

  • Біріншісі - жыл секіру немесе жоқ екенін тексеру.
  • екінші - айдағы күндер санын көрсету

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 = ...» пайдаланыңыз. Екінші әдіске қол жеткізу үшін «this.year» пайдаланыңыз.

5
қосылды
Рахмет сізге!
қосылды автор 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 әдісінен қоңырау шала алмау проблемасы емес мәселе болмауы керек ...

EDIT: Жоғарыда айтылғандай, сіздің жыл өткен сайын есептеулеріңіз дұрыс емес - Мен күнделікті заттардың күнтізбе жағы жаттығудың мақсаты болып табылады деп ойлаймын, бірақ қалыпты жағдайда Calendar (және оның қосалқы сыныптары) немесе бастау үшін Joda Time .

4
қосылды
@Kiril: Міне, бұл қоңырау шалу туралы негізгі әдіс, бірақ бәрібір дұрыс емес. static дегеніміз не екенін түсіну өте маңызды - кітапты немесе оқулықты өте мұқият оқып шығуды ұсынамын .
қосылды автор Jon Skeet, көзі
@ Thor84no: Иә шынымен :)
қосылды автор Jon Skeet, көзі
Бұл жақсы жауап, мен дәл осы күнді тестілеу кезінде, ол қазіргі уақытта жасайтын (дұрыс емес) қолмен тестілеуден гөрі Күнтізбені (ең алдымен, GregorianCalendar) пайдалануды қарастыруы керек. GregorianCalendar сізге youLeapYear әдісі ұсынады.
қосылды автор Thor84no, көзі
@Kiril Түсінудің ең бастысы - нысан мен сынып арасындағы айырмашылық. Статикалық әдістер сыныптарға жатады және объектілерге жатпайтын статикалық әдістерге жатады. Нысандар сыныптың жекелеген даналары болып табылады, сіздің жағдайда LeapYearCheck сіздің сыныпыңыз және ob - сіздің нысаныңыз.
қосылды автор Thor84no, көзі
Ал, мен басты мәселе статикалық болған кезде оны тек басқа статикалық әдістер арқылы ғана алуға болады, ол дұрыс емес пе?
қосылды автор Kiril, көзі

Бұл жұмыс істеу керек. Мүмкін дұрыс емес, бірақ ол жүгіреді. Мүмкін сіз негізгі әдіс бойынша екі әдісті шақыру туралы ескертуге сілтеме жасай аласыз. Көріп отырсыз, сіздің екі әдісіңіз статикалық болып табылады. Статикалық әдіс шақырылатын объект данасын талап етпейді. Дегенмен, оларды LeapYearCheck данасына шақырадыңыз. Бұл рұқсат етілмейді (ол тиісті сыныпқа делегат болады).

0
қосылды