5

私の先生がコードを書き、整理する方法は、私の補足教科書で提案されているものとは大きく異なります。最近のラボでは、wheelsライブラリを使用して1つのウィンドウに複数のオブジェクトを表示する必要がありました。これが私の先生によって書かれたSnowmanクラスです(他のオブジェクトのコードは便宜上含まれていません):

public class Snowman {
    private Ellipse _top;
    private Ellipse _middle;
    private Ellipse _bottom;

public Snowman() {
        _top = new Ellipse();
        _top.setColor(Color.WHITE);
        _top.setFrameColor(Color.BLACK);
        _top.setFrameThickness(1);
        _top.setSize(80, 80);
        _middle = new Ellipse();
        _middle.setColor(Color.WHITE);
        _middle.setFrameColor(Color.BLACK);
        _middle.setFrameThickness(1);
        _middle.setSize(120, 120);
        _bottom = new Ellipse();
        _bottom.setColor(Color.WHITE);
        _bottom.setFrameColor(Color.BLACK);
        _bottom.setFrameThickness(1);
        _bottom.setSize(160, 160);
    }
    public void setLocation(int x, int y) {
        _top.setLocation(x + 40, y - 170);
        _middle.setLocation(x + 20, y - 100);
        _bottom.setLocation(x, y);
    }
}    

このオブジェクトは、とりわけ、後でSnowmanCartoonクラスでインスタンス化されます。

public class SnowmanCartoon extends Frame{
    private Snowman _snowman;
    private Eyes _eyes;
    private Hat _hat;
    private Bubble _bubble;

    public SnowmanCartoon() {
        _snowman = new Snowman();
        _snowman.setLocation(100, 300);
        _eyes = new Eyes();
        _eyes.setLocation(165, 150);        
        _hat = new Hat();
        _hat.setLocation(152, 98);
        _bubble = new Bubble();
        _bubble.setLocation(280, 60);
    }
    public static void main(String[] args) {
        new SnowmanCartoon();
    }
}

これが私の懸念です:

  1. これらのクラスの両方で、なぜクラスと同じ名前のメソッドがあり、その目的は何ですか?

  2. 何も返さないのにsetLocation()、メソッドがvoidメソッドであるのに、メソッドがvoidメソッドであるのはなぜですか?Snowman()Snowman()

  3. クラスでは、とSnowmanCartoon言うとき、クラス、またはむしろメソッド を参照していますか?private Snowman _snowman;_snowman = new Snowman();SnowmanSnowmanSnowman()

  4. Snowmanオブジェクトのインスタンス化がSnowman()そのすべてのプロパティを設定するメソッドを参照している場合、ドット演算子を使用する必要がないのはなぜSnowman.Snowman()ですか。

  5. 私の教科書では、インスタンス変数とメソッドは1つのクラスで宣言され、別のクラスでインスタンス化されます。しかし、それらは私の先生のコードで同時に発生しているようです。

4

5 に答える 5

8

クラスと同じ名前のメソッドは、クラスの「コンストラクター」と呼ばれます。オブジェクトをインスタンス化するために使用されます。

例:

public class MyClass { // class
    public MyClass() { // constructor

    }
}

コンストラクターは他のメソッドとまったく同じですが、戻り型がないことに注意してください。基本的に「this」オブジェクトを返します。

電話するとき

MyClass a = new MyClass(); 

これにより、実際にコンストラクターが呼び出され、オブジェクトが作成されます。

異なる数とタイプのパラメーターを使用することにより、クラスに複数のコンストラクターを含めることができることに注意してください。

Javaでは、コンストラクターを含めない場合、デフォルトでは、どのクラスにもデフォルトのパラメーターなしコンストラクターがあります。

public MyClass() {
}

オンラインのコンストラクターで利用できる大量の情報。これらは、オブジェクト指向プログラミングの学習を開始するための基本的な概念です。ここにいくつかの詳細情報。

-編集-特定の質問を呼び出す方法についての質問に答えます。

これらの2つのコンストラクターを取る

public MyClass(){
// do things
}

public MyClass(String p){
// do things
}

次に、オブジェクトをインスタンス化するとき

MyClass c = new MyClass(); // use constructor 1
MyClass d = new MyClass("value"); // use constructor 2
于 2012-11-01T21:35:56.417 に答える
6

public Snowman() {...}コンストラクターと呼ばれます。これは、このクラスのオブジェクトを作成しているときに呼び出されます。コンストラクターを定義しない場合、jvmは暗黙的にコンストラクターを作成します。コンストラクターの詳細については、このjavadocをお読みください。

Snowman()メソッドではなく、コンストラクターです。コンストラクターには戻り型がありません。リターンタイプを追加すると、メソッドとして扱われます。

于 2012-11-01T21:33:51.343 に答える
4

これらのクラスの両方に、クラスと同じ名前の「メソッド」があるのはなぜですか?

この種のメソッドはコンストラクターと呼ばれます。パラメータを受け取らない場合は、「デフォルトのコンストラクタ」として知られています。コンストラクターは、インスタンスを構築するために使用するものです。Snowman s = new Snowman();デフォルトのコンストラクターを呼び出します。

メソッドsetLocationがvoidメソッドであるのに、Snowmanは何も返さないのに、なぜ1つではないのですか?

コンストラクターは通常のメソッドとは異なるためです。オブジェクトのインスタンスをnew Snowman()返します。つまり、デフォルト状態のSnowmanの新しいインスタンスを返します。

メインのSnowmanCartoonクラスで、プライベートSnowman_snowmanと表示されている場合。_snowman = new Snowman();、それはSnowmanクラスを参照していますか、それともSnowman()メソッドを参照していますか?

表示された場合new Snowman()(または同等のもの)、それは常にコンストラクターを参照しています。

そのため、Snowman.Snowman()を実行してすべてのプロパティを設定する必要がないのはなぜですか。これはメソッドであり、public static voidmainではないためです。

プログラムを実行するときは、クラスを実行していません。オブジェクトのインスタンスをインスタンス化して、他の操作で使用します。言うと、名前が付けられSnowman s = new Snowman()Snowmanオブジェクトが残りs、そのオブジェクトで何かを実行できるようになります。

Head First Javaでは、インスタンス変数とメソッドは別のクラスで宣言されますが、インスタンス化されるのは別のクラスです。ここでは、これは同時に起こっているようですが、私にはその方法がわかりません。

この質問は私にはあまり意味がありません。

メインクラスでは、新しいSnowmanCartoonを作成するときに、ウィンドウを作成するなど、それを起動するために何かをする必要がないのはなぜですか?

これは、そのクラスが拡張しているためですFrameFrame基本クラス(SnowmanCartoon)で使用されるデフォルトの操作があります。つまり、あなたのスーパークラスがあなたのためにこれを処理しているのです。

お役に立てば幸いです。

于 2012-11-01T21:42:56.913 に答える
3

これは、Javaではコンストラクターと呼ばれます。このメソッドは、次の場合に呼び出されます。

Snowman s = new Snowman();
于 2012-11-01T21:38:47.237 に答える
2

1これはメソッドではなく、コンストラクターです。

2voidは単なるリターンタイプです。voidは、メソッドが何も返さないことを意味します。また、コンストラクターにはリターンがありません。

3 Snowman()コンストラクターを参照しています。それは方法ではありません。雪だるまオブジェクトを作成します。

5雪だるまオブジェクトのインスタンス化を別のクラスに入れることができます。簡単にするために、先生は同じクラスに入れていると思います。

6JVMがそれを処理すると思います。

于 2012-11-01T21:38:06.093 に答える