5

クラスからメソッドを呼び出していますが、メソッドを静的にするとエラーが発生します。この質問をしたとき、私はその理由について混乱しています クラス変数とコンストラクターのパラメーターの違いは何ですか? 私の理解では、クラス変数は静的に作成されました。

患者クラス:

public  String  setOption(String option) throws IOException
{
        option = stdin.readLine();
        //stuff here
    return option;
}

患者管理システム:

public class PatientManagementSystem
{
    static BufferedReader stdin = new BufferedReader(new InputStreamReader(
            System.in));
    public static void main(String[] args) throws IOException
    {
        Patient.setOption(null);    
    }
}

エラー:
ここに画像の説明を入力

メソッドを静的に変更するか、ローカル変数を作成しますか?

4

9 に答える 9

5

Patient(おそらく)クラスのオブジェクトを作成する必要があります。

Patient myPatient = new Patient();
myPatient.setOption(null);

そのような限られた情報で何をしたいのかを必ずしも知ることは困難です。クラスで何をするつもりなのかわかりませんPatientが、私の最善の推測は何ですか? setter命名規則を使用してメソッドを呼び出そうとしていることを考えると、このようにするのは理にかなっています。

オブジェクトをインスタンス化しsetOptionstaticメソッドを作成するつもりがない場合は、おそらくメソッド名を変更する必要があります。


正確に何を達成しようとしているのかについてのより詳細な説明があれば (疑似コードについて話すのではなく、何をしようとしているのかについての非常に抽象的な考えにすぎません)、staticここで詳細を説明する方が簡単でしょう (あなたの具体的な例)とあなたがすべきことなど

于 2013-11-06T13:13:23.483 に答える
3

メソッドを静的に変更するか、ローカル変数を作成しますか?

どちらでもOKです。

メソッドがクラス変数を使用しない場合は、メソッドを静的にすることをお勧めします。これにより、メソッド呼び出しのためにクラスをインスタンス化する必要がなくなります。

于 2013-11-06T13:13:22.950 に答える
3

何かを静的にするか非静的にするかという問題は、モデル化されている現実世界のオブジェクト/概念に基づいています。Patientこのコードのオブジェクトの例を見てみましょう。に関するコードを見なくても、 a とは何か、何を表しPatientているのかは明らかです。したがって、最も簡単に言えば:Patient

  • 特定 のもの (Jane Doe としましょう) で何かをしている場合Patient、それは静的ではありません。のインスタンスで動作していますPatient
  • の概念に関して何かをしている場合Patient、それは静的です。

したがって、いくつかの非静的操作は次のようになります。

  • Patientの名前を更新
  • Patient入院・退院
  • Patientを別のDoctor

これらにはすべて、どこかで初期化された特定の が含まれます。 Patient

var janeDoe = new Patient("Jane Doe");
// ...
janeDoe.TransferTo(doctorSmith);

私は実際に a のいくつかの静的メソッドを考えるのに苦労していPatientます。静的メソッドの最も一般的な例は、おそらくファクトリ メソッドであり、既存の sPatientまたは s のコレクションを取得しますPatient。何かのようなもの:

var janeDoe = Patient.Fetch("Jane Doe");

また:

var todaysPatients = Patient.Fetch(DateTime.Today);

さまざまなヘルパー メソッドも静的であることがよくあります。たとえば、Patientオブジェクトを受け取ってMedicalRecord別の形式に変換するオブジェクトのメソッドなどです。

しかし、全体的な考え方は同じです。オブジェクトの特定のインスタンスと対話している場合、そのオブジェクトのインスタンスが現実世界の概念を表す必要があります。

于 2013-11-06T13:25:02.447 に答える
2

メソッドを静的に呼び出すには、 static にする必要があります。

public static String  setOption(String option) throws IOException

しかし、あなたの例では、標準入力が患者クラスの静的メンバーでない場合、機能しません。

要約すると、メソッドが static として宣言されている場合と同じ方法でメソッドを呼び出すことができます。静的メソッドでは、クラスの静的メンバーのみにアクセスできます。

于 2013-11-06T13:13:31.767 に答える
2

あなたのでこれを試してくださいmain method

Patient myPatient = new Patient();
myPatient.setOption(null);
于 2013-11-06T13:14:09.313 に答える
2

クラスのオブジェクトを作成せずにそのメソッドを直接呼び出しているためです。

いつ静的メソッドを使用しますか?

于 2013-11-06T13:12:41.947 に答える
2

クラス Integer の parseInt のように、これらのメソッドをユーティリティ メソッドとして使用する場合は、静的メソッドを含むクラスを作成します。したがって、メソッドを変更する

public static String  setOption(String option) throws IOException // STATIC
{
    option = stdin.readLine();
    //stuff here
    return option;
}

そして、次のような方法を使用します

    Patient.setOption(null);    

ORのように患者のオブジェクトをインスタンス化します

    Patient obj = new Patient();
    obj.setOption(null);    
于 2013-11-06T13:16:08.947 に答える