-1

私がそう使うなら

class Test {
    public Test() {
        System.out.println("constructor");
    }
}

public class MainClass {
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
    }
}

2 つの出力コンストラクター コンストラクターを取得します

しかし、コンストラクター (public void Test()) に void を追加すると、出力は空になります。なぜそんなに奇妙ですか?

4

8 に答える 8

11

おかしなことではなく、通常の動作です。コンストラクターに戻り値の型がありません

public Test() {
    System.out.println("constructor");
}

コンストラクタですが、

public void Test() {
    System.out.println("constructor");
}

を使用して呼び出すことができる単純なメソッドですt1.Test()

このページには、コンストラクターとメソッドの違いがリストされています。

1)Javaのメソッドとコンストラクターの最初の違いは、コンストラクターの名前がクラスの名前と同じでなければならないことですが、Javaのメソッドにはそのような要件はありません。Java では、メソッドに任意の名前を付けることができます。

2)Javaのメソッドとコンストラクターの2番目の違いは、コンストラクターには戻り値の型がありませんが、メソッドには戻り値の型があり、voidでない限り何かを返すことです。

3) Java におけるコンストラクターとメソッドの 3 番目の違いは、コンストラクターが連鎖され、特定の順序で呼び出されることです。メソッドにはそのような機能はありません。

4) メソッド、コンストラクターとは異なり、クラスで宣言されていても、クラスのメンバーとは見なされません。コンストラクターは子クラスに継承されませんが、メソッドは非公開になるまで子クラスに継承されます。その場合、それらは宣言されているクラスでのみ表示されます。同様に、プライベート コンストラクターは、そのクラスのオブジェクトを外部から作成できないことを意味します。これは、Java でシングルトン パターンを実装するために使用される手法の 1 つです。

5) Java のメソッドとコンストラクターのもう 1 つの違いは、特別なキーワード this と super を使用してコンストラクターを明示的に呼び出すことです。メソッドにはそのようなものはありません。それらを呼び出すために使用できる独自の名前があります。

于 2013-06-22T11:18:24.207 に答える
5

コンストラクターに追加voidすると、コンストラクターではなくなるためです。たまたまクラスと同じ名前のメソッドです。

次に、「しかし、コンストラクターが存在しない場合、どうすればコンストラクターを呼び出すことができますか?」と尋ねることができます。さて、すべてのクラスには暗黙的な引数なしのコンストラクターがあります。

結論: コンストラクターには戻り値の型があってはなりません。

于 2013-06-22T11:18:32.023 に答える
2

コンストラクターには戻り値の型がありません。メソッドには戻り値の型があります。追加するvoid()と、メソッドになります。メソッドを呼び出すには、それを呼び出す必要があります。

t1.test();
于 2013-06-22T11:18:32.420 に答える
1

あなたが書くとき:

public Test() 
    {
        System.out.println("constructor");
    }

これは間違いなくコンストラクタです。そして、次のように記述して Test クラスの最初のオブジェクトを作成すると、

    Test t1 = new Test();

これにより、コンストラクターが初めて呼び出され、print ステートメントで記述したコード、つまりコンストラクターがコンソールに出力されます。クラスのオブジェクトを作成すると、コンストラクターが自動的に呼び出されることに注意してください。

2 回目にオブジェクトを作成するには、次のように記述します。

    Test t2 = new Test();

これは同じコンストラクターを呼び出し、同じ「コンストラクター」を画面に表示しますが、2 回目になります。

したがって、コンストラクターコンストラクターとして答えが得られます

2 番目のケースでは、次のように記述します。

public void test()
    {
        System.out.println("constructor");
    }

コンパイラはそれをコンストラクタではなくメソッドとして扱います。

void が何も返さない場合でも、それは「戻り値の型」であり、コンストラクターは決して戻り値の型を持つことはできません。これは、何も返さないという意味ではありませんが、戻り値の型がないだけです。

そのため、クラスのオブジェクトが作成されたときにメソッドが自動的に呼び出されることはありません。したがって、同じ結果を期待するべきではありません。

コンパイラーは、定義していなくても、すべてのクラスにダミー/デフォルトのコンストラクターを提供するため、空の出力が得られます。そして、このデフォルトのコンストラクターは、明示的に呼び出すかどうかに関係なく、クラスのオブジェクトを作成するたびに呼び出されます!

デフォルトのコンストラクターは、次のようにどこかに書かれていると考えることができます。

test() {   }

これで、2 つのオブジェクトを作成するとどうなるか想像できるようになりました。プログラムは正しくコンパイルおよび実行され、空の出力が返されます。

お役に立てば幸いです。

于 2013-06-22T11:42:05.793 に答える
0

コンストラクターには戻り値の型がないためです。戻り値の型を追加するときに作成するのは、何も返さないvoidという名前のメソッドです。Test()

何も記述していないため、コンパイラは引数のないコンストラクターを提供しますが、それは作成したメソッドではないため、何もしません。

于 2013-06-22T11:19:23.860 に答える
0

Java コンストラクターは、それが属するクラスの名前と同じ名前を持ちます。コンストラクターは値を返さないため、コンストラクターの構文には戻り値の型は含まれません。

 public Test() {
    System.out.println("constructor");
}
于 2013-06-22T11:19:54.827 に答える