4

Netbeans は、非静的メソッドから静的メソッドにアクセスするのは良くないと教えてくれました。なぜこれが悪いのですか?「静的メソッド getInstance へのアクセス」は警告です。

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}

4

7 に答える 7

19

直接ではなく、インスタンスから静的メソッドにアクセスしている可能性があります。Calendar.getInstance()代わりに使用してみてください:

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}
于 2009-01-01T19:43:23.683 に答える
15

「静的メソッドを返す」とはどういう意味ですか? もちろん、状況にもよりますが、私の見解ではインスタンスメソッドから静的メソッドを呼び出すことは問題ありません。Netbeans が不平を言っているコードをいくつか投稿していただけますか?

想像できることの 1 つは、インスタンスのデータをまったく使用せずに、インスタンス メソッドの静的メソッドのみを使用する場合です。インターフェースを実装したり、基本クラスからメソッドをオーバーライドしたりするために必要な場合もありますが、何もオーバーライドしておらず、インスタンス変数も使用していない場合は、メソッドを静的にして、実際にはそうではないことを示すとよいでしょう。特定のインスタンスに依存します。

編集:編集された質問では、これは非常に理にかなっています。IMOは、そもそもそれを可能にするJavaの欠陥です。非常に誤解を招くコードになる可能性があります。私のお気に入りの例 (つまり、ベテランは私が以前に投稿したのを見たことがあるかもしれません:) はThread.sleep. このコードは何をしているように見えますか?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

私の考えでは、新しいスレッドがスリープするように求められているように見えます - への呼び出しに似ていますsuspend。しかし、いいえ-現在実行中のスレッドにのみスリープを要求できます。これがThread.sleep静的メソッドである理由です。上記のコードは正当な Java であり、新しく作成されたスレッドが (おそらく) 実行されている間、現在実行中のスレッドを 1 秒間スリープさせます... 一見コードがどのように見えるかはまったく異なります。

于 2009-01-01T19:28:57.147 に答える
1

順番が逆になっていませんか?もしそうなら、静的メソッドから非静的メソッドにアクセスできないのは理にかなっています。そうでない場合は、なぜこれが悪いのか知りたいです!

于 2009-01-01T19:29:04.290 に答える
0

電話するだけでいいtime.getInstance()です。この場合、コンパイラは変数の型を調べ、Calendarそこでメソッドを呼び出します。とまったく同じようにコンパイルされCalendar.getInstance()ます。の実際の値はtimeこれに寄与しないことに注意してくださいnull

眉をひそめているのは、この間接的であり、通常の方法との違いです。と直接表現するのがベストCalendar.getInstance()です。

于 2009-01-01T20:51:23.750 に答える
0

非静的メソッドは、静的コンテキストから参照できません。静的メソッドは、非静的コンテキストから参照できます。

Netbeans のエラーまたは警告ですか? それを引き起こしているコードを投稿できますか?

于 2009-01-01T19:43:37.320 に答える
0

簡単に説明しないのはなぜですか:

非静的メソッドを呼び出す場合、1) a=new Class(); で新しいインスタンスを作成します。2) 次に、メソッド a.method を呼び出します。

静的メソッドを呼び出す場合: 1) Class.method と呼びます。

クラス内で独立しており、呼び出しに必要なものがすべて揃っているという理由だけで、静的メソッドでそれを行うことができます。他の情報 (コンストラクターとして) に依存している場合は、静的に宣言しないと失敗します。

于 2013-05-16T07:58:11.943 に答える
-1

Javaでは、すべての静的メンバー変数が最初にメモリにロードされ、次にすべての静的メンバーがロードされ、その後、非静的変数とメンバー関数がメモリにロードされ、その後静的メインブロックが実行されます...... . だからそれはエラーを与えていた

于 2010-07-29T05:20:29.257 に答える