メインからのメソッドの呼び出し

私はメソッドを呼び出すことに問題があります。例えば、私は次のプログラムに2つのメソッドを持たせたい:

  • 最初は閏年かどうかを確認することです。
  • 2番目は月の日数を表示することです

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,
ええ、私は問題を見ません。メソッドをpublic/protected/privateにして静的にしたり、それらのメソッドを呼び出すオブジェクトを作成したりしないでください(静的メソッドは静的な方法で呼び出される必要があります。それらは直接、インスタンスの必要はありません)。ああ、もちろん、うるう年かどうかの計算は実際には正しくないが、プログラムが失敗することはない。
追加された 著者 Thor84no,
何が問題なのですか?プログラムは私のためにかなりうまくいく(しかし、いくつかの論理エラーがある)
追加された 著者 Philipp Reichart,
まあ、不要なオブジェクトの作成以外、何が間違っているのですか?
追加された 著者 amal,
あなたが最初に入力した年が2番目のprintステートメントに表示されないということはあなたの問題ですか?
追加された 著者 amal,
申し訳ありませんが、仲間を仲間にする/
追加された 著者 Kiril,
歓声Philipp私はそれを感謝します
追加された 著者 Kiril,
たとえば、まず番号を入力する必要があります。次に、年を入力して最後に "0年"と表示されます。 "1年を入力:400 400閏年:月を入力:5 31日間5月0日 "任意のアイデアですか?
追加された 著者 Kiril,

3 答え

メソッドは「静的」と宣言されます。 Javaでは、クラスのオブジェクトではなく、メソッドがクラスで使用可能であることを意味します。

明確にするには:私はあなたの問題を理解するのは、第2の方法を呼び出すとき、最初の方法の年がもう利用できないということです。

これは、インスタンス変数に格納するのではなく、メソッドのローカル変数に格納するためです。メソッドが完了すると、ローカル変数はなくなります。代わりに、クラスのインスタンス変数を作成します(例: "プライベートint年;"。最初の方法では、 "this.year = ..."を使用して変数に値を割り当てます。 2番目の方法では、 "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 メソッドの場合:

  • 今年は尋ねることはありません
  • 2月の29日を報告する前にうるう年を検出しようとしていません。

基本的にコードは現時点ではちょっと混乱しますが、 main からメソッドを呼び出せないという問題は、問題ではありません

編集:あなたのうるう年の計算はとにかく間違っています - 私は物事のカレンダー側が練習の目標の一部であると仮定していますが、通常は Calendar そのサブクラス)または Joda時間から始めましょう。

4
追加された
@Kiril:主な方法は呼び出すことですが、とにかく間違っています。 static が意味することを本当に理解することが重要です。書籍やチュートリアルを非常に慎重に読むことをお勧めします。
追加された 著者 Jon Skeet,
@ Thor84no:はい、確かに:)
追加された 著者 Jon Skeet,
これは良い答えです、私はちょうどこれを日付のようなものをテストするとき、彼はおそらくカレンダー(おそらくGregorianCalendar)を使用することを検討する必要があることを追加したいと思います。 GregorianCalendarはisLeapYearメソッドを提供します。
追加された 著者 Thor84no,
@Kiril オブジェクトクラスの違いは、主に理解することです。静的メソッドはクラスに属し、非静的メソッドはオブジェクトに属します。オブジェクトはクラスの個々のインスタンスですが、 LeapYearCheck はクラスであり、 ob はオブジェクトです。
追加された 著者 Thor84no,
まあ、私はタイルをメインのmathodが静的なときには、他の静的メソッドを介してのみアクセスすることができますそれは正しくないですか?
追加された 著者 Kiril,

これは実行する必要があります。正しくないかもしれませんが、実行されます。おそらく、あなたは、あなたのメインメソッドの2つのメソッド呼び出しで取得する警告を参照しています。あなたの2つの方法は静的です。静的メソッドでは、オブジェクトインスタンスを呼び出す必要はありません。しかし、あなたはLeapYearCheckインスタンスでそれらを呼び出すことになります。これは許可されます(適切なクラスに委譲します)。ただ必要ではありません。

0
追加された