1

これらのコンストラクターの違いを説明できる人はいますか? これを参照してください。

  public MyClass() {
  }

  public MyClass() {
      this();
  }

  public MyClass() {
      super();
  }     
4

12 に答える 12

3

デフォルトのコンストラクターのみを再帰的に呼び出すため、Java で Second を宣言することはできません。また、デフォルトでは、明示的に指定されていない場合、コンストラクターには常にコンパイラーによって挿入される super() メソッドがあります。

于 2012-08-16T05:45:04.437 に答える
2
public MyClass() { }

空の引数なしコンストラクターを宣言します。クラスのコンストラクターを宣言しない場合、コンパイラーはこのコンストラクターをクラスに効果的に挿入します。

public MyClass() { this(); }

コンパイルされません。

public MyClass() { super(); }

スーパークラスのデフォルトコンストラクターを呼び出すコンストラクターです。これは、スーパークラスにデフォルトのコンストラクターがある場合、またはコンストラクターがない場合にのみコンパイルされます(この場合、コンパイラーは、前述のように、とにかくデフォルトのコンストラクターを挿入します)。また、super();通話を省略しても同じ効果があります。

于 2012-08-16T05:51:52.317 に答える
1

2番目のケースでは、おそらく次のように書くつもりだったと思います。

public MyClass() {
  super();       // not "this();"
}

いずれにせよ、2番目のケースはコンパイルエラーです。JLSはこれを言います:

「コンストラクターが、これに関連する一連の1つ以上の明示的なコンストラクター呼び出しを介して、直接または間接的に自分自身を呼び出すことは、コンパイル時のエラーです。」 JLS 8.8.7

あなたの例でthis()は、は同じコンストラクターを直接呼び出す明示的なコンストラクター呼び出しです。


最後に、最初の形式と3番目の形式の間に意味上の違いはありません。最初の形式には、スーパークラスの引数なしコンストラクターの暗黙的な呼び出しがあり、3番目の形式では、その呼び出しを明示的にします。

読みやすくするために明示的な呼び出しを使用してフォームを作成することを好む人もいますが、IMOでは実際には何の違いもありません。

于 2012-08-16T05:48:31.593 に答える
1

とてもシンプルです

わかってもらいましょう

最初

public MyClass() {  }

単なるデフォルトのパブリックコンストラクターです

でもこれを書くと

public MyClass() { this(); }    

これは、コンストラクター チェーンを適用していることを意味します。コンストラクター チェーンは、同じクラスの別のコンストラクターを呼び出すだけです。これは、コンストラクターの最初のステートメントでなければなりません。しかし、あなたのシナリオでは何も渡していません。this();つまり、同じコンストラクターを再度呼び出しているため、無限ループが発生します。クラスには、このような別のコンストラクターがある場合があります

public MyClass(int a) { }

次に、これを呼び出した可能性があります

public MyClass(){ this(10); }

上記のステートメントにより、渡したのと同じ引数を受け取るコンストラクターにジャンプするようになります

今、

public Myclass(){ super(); }

class によって継承されるスーパー クラスのコンストラクターを呼び出していることを示しますMyClasssuper();ここでも同じシナリオが発生します。スーパー クラスのデフォルト コンストラクターを呼び出す に何も渡していません。

于 2012-08-16T06:05:45.023 に答える
1

Lets look at the three type of constructor calls one by one.Each one has special purpose associated with them. But the concept is simple and very interesting to explore.

Case 1 :- This is default constructor with no arguments

        public class MyClass{             
         public MyClass(){ 
            } 
         }

The compiler will automatically supply a no-argument constructor for you if you do not write one.Thus if you write public class MyClass{ } .

This is equivalent to writing

public class MyClass{
MyClass(){ } }

Points to be noted :-

  1. Compiler automatically provide "super" when you do not use super "as the first line of the constructor". NOTE:- For "super" and "this" when you use in constructors always write them in the first line of your constructor code otherwise compiler will give error.

  2. Even when you do not extend MyClass here compiler will give call to constructor to super Object class which is the root class of every class you create.

Case 2:- The use of "this".

Constructors use "this" to refer to another constructor in the same class with a different parameter list.

       public MyClass() { 
        this();
          } 

So the above code will give compilation error "Recursive Constructor Invocation" as it is calling the same constructor and will end up in an infinite loop. To make this work you can instead write

public MyClass(String str){
 System.out.println("constructor with arg "+ str);
 }
public MyClass(){
this("Cons");      // note that "this" has to be at first line otherwise compiler gives error
System.out.println("constructor with no arg");
  }

Here you can see the importance of "this" in constructors. It is used to call constructors from another constructor in the same function.

Case 3:- Use of "Super". Super is used to make a call to no-arg constructor of super call. Rest information is mentioned in Case 1 already.

         public MyClass() { 
         super();
         }     
于 2012-08-16T07:17:07.550 に答える
0

2つ目は、同じコンストラクターをそれ自体から呼び出しているため、エラーが原因でコンパイルされないスタックオーバーフローが原因で、OutOfMemoryError例外が確実に発生します。Recursive constructor invocation書くつもりでしたか

super();

?その場合、両方の形式は同じです。

public MyClass() {
}

基本クラスのデフォルトの引数なしコンストラクターが存在する場合は、暗黙的に呼び出します。

于 2012-08-16T05:47:10.727 に答える
0

1つ目は、デフォルトの空のコンストラクターです。それは単に何もしません。(引数付きの)他のコンストラクターがない場合は、この種のコンストラクターを定義する必要はまったくありません。コンストラクターが定義されていない場合は、暗黙的にデフォルトになります。

2番目はそれ自体を呼び出し、再帰ループを引き起こすため、禁止されています。

3つ目は、スーパークラスのデフォルトの引数なしコンストラクターを呼び出しますが、それ以上は何もしません。スーパークラスは、クラスの元のクラスextends、または(キーワードObjectを指定しない場合は暗黙的に拡張された)クラスです。extends

于 2012-08-16T05:47:32.483 に答える
0

コンストラクター内から、thisキーワードを使用して、同じクラスの別のコンストラクターを呼び出すこともできます。これを行うことは、明示的なコンストラクタ呼び出しと呼ばれます http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 0, 0);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}

しかし、2つ目は、コンストラクターの再帰的な呼び出しにつながり、許可されません。

于 2012-08-16T05:50:40.193 に答える
0
public MyClass() {  }

->これは、デフォルトコンストラクタとも呼ばれる通常のコンストラクタです。

  public MyClass() {
      this();
  }

->コンストラクターを再帰的にしています。このように使用しないでください。さてあなたは次のように利用することができますthis()

public MyClass() {
    this(1); // always intitalize to 1
}


public MyClass(int i) {
    this.i=i;
}
于 2012-08-16T05:50:58.077 に答える
0
  1. 特別なことを何もしないデフォルトのコンストラクタ。Javaの各クラスは、独自のコンストラクターを作成するまでデフォルトでそれを持っています。その後、独自に再度定義する必要があります

    パブリック A() {}

    パブリック A(int 値) {}

  2. 再帰呼び出しを持つデフォルトのコンストラクターです (無効であり、使用しないでください)。this()デフォルトのコンストラクターを呼び出します。たとえばthis(5)、1 の例のように int 値をパラメーターとして受け取る定義済みのコンストラクターを呼び出します。

    public A() { this(5); }

    パブリック A(int 値) {}

  3. スーパークラスからデフォルトのコンストラクターを呼び出すデフォルトのコンストラクター

    抽象クラス A { public A() {} }

    class B extends A { public B() { /* A() を呼び出します */ super(); }

于 2012-08-16T05:54:56.827 に答える
0

最初のケースでは、コンストラクターは、この場合は Object クラスになると思われるスーパークラスの引数コンストラクターへのサイレント呼び出しを挿入します。2 番目のケースでは、this() 呼び出しはクラスの引数なしのコンストラクターを呼び出します。たまにエラーになることもあります。

于 2012-08-16T05:45:39.913 に答える
0

this()No-Args コンストラクターを呼び出すために使用されます。MyClass()

コンパイルRecurssion constructor error中に与えますが

例えば:

public MyClass{


   public MyClass(){

  this(5);     // Here this(5) will be used to call the MyClass Constructor with
               // int value as Parameter
    }


   public MyClass(int i){



    }

}
于 2012-08-16T05:44:27.660 に答える