web-dev-qa-db-ja.com

Javaのクラスのメインの内部からオブジェクトをインスタンス化する

私はOOPクラスのドキュメントを調べていましたが、この例を見つけました:

class Student {
    private String name;
    public int averageGrade;


    public Student(String n, int avg) {
        name = n;
        averageGrade = avg;
    }

    public static void main(String[] args) {
        Student s = new Student("John", 9);
    }
}

彼らが同じクラスのメインからオブジェクトをインスタンス化しているのは混乱しています。これは悪い習慣と考えられますか?新しく作成されたオブジェクトsにはmainメソッドがありますか?

ありがとうございました!

18
Mihai Neacsu

これには何の問題もありません。それは完全に正常です。 (確かに、mainメソッドを含むクラスが明らかに可能なものであることはより理にかなっていますexecute-mainクラスのStudentメソッドは、同じくらい意味があります。)

オブジェクトには実際にはメソッドがありません-classesメソッドがあります。特定のコンテキストなしで呼び出される静的メソッドと、そのタイプの特定のオブジェクト(またはサブクラス)で呼び出されるインスタンスメソッドのどちらかです。

あなたがcouldを呼び出す間s.main(...)は、実際には静的メソッドStudent.mainの呼び出しに解決されるだけです。混乱を招くので、このような式を介して静的メソッドを呼び出すべきではありません。

17
Jon Skeet

いいえ、それは悪い習慣ではありません。実際にはかなり頻繁です。あなたが見逃したのは、メインが静的メソッドであることです。それはStudentオブジェクトのメソッドではありません。これはStudentクラスのメソッドです。 someStudent.main(...)ではなく、Student.main(...)で呼び出します。

詳細については、 http://download.Oracle.com/javase/tutorial/Java/javaOO/classvars.html を参照してください。

15
JB Nizet

これで結構です。

少し再帰的に見えますが、コマンドラインからこのクラスを起動するとmain()メソッドが呼び出され、オブジェクトのインスタンスを実際にインスタンス化するとコンストラクタが呼び出されます。 (ジョンのコメントも参照してください。)

3
Sean McMains

良くも悪くもない。

使い方次第です。あなたの例では、コンストラクターは定義上静的なmain()メソッドから呼び出されるため、他に選択肢はありません。

このパターンの「良い」使用法のさらに別の例は、ファクトリメソッドパターンです。列挙型はこの手法をvalueOf()メソッドでも使用します(これもファクトリメソッドの例です)。

2
AlexR

それは完全に細かいそれは完全に細かいです...クラスのメンバーが静的として宣言されている場合、それはエンティティがクラスの特定のオブジェクトとは異なる方法で生きます。オブジェクトを使用せずに、それ自体で使用できるものです。 OR異なるオブジェクト間で共通です。クラスの静的変数を設定することで、クラスから作成されたオブジェクトの数を実際にカウントできます

_ class   A
     {
         A()
          {
           count++
           }

     static count=0;
       --- 
       ---
      }
_

Aのオブジェクトが作成されるたびに、作成されたカウントは1を追加します。

静的メソッドはどのオブジェクトにも属していないため、クラスの外では、通常のメソッドがclassname.method()として呼び出されるのと同じように、classObject.method()として呼び出されます

1
ISONecroMAn