web-dev-qa-db-ja.com

Javaのコンストラクタの戻り型は何ですか?

知っているように、戻り値の型をJavaコンストラクターに追加する必要はありません。

class Sample{
  .....
  Sample(){
    ........
  }
}

Objective Cでは、コンストラクターを作成すると、そのクラスへのポインターが返されます。しかし、それは強制ではないと私は思います。

AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass

同様に、コンストラクターは独自のクラスへの参照を返すメソッドに変換されますか?

このような:

class Sample{
    .....
    Sample Sample(){
      ........

      return this;
    }
}

コンパイラーは、コンストラクターに同じクラスへの参照の戻り型を追加しますか?コンストラクタはどうなっていますか?これを研究するための参照はありますか?

編集:

実際、私はバイトコードレベルまたはJVMレベル、あるいはそれ以下でさえ答えを求めています。

16
sonu thomas

Javaでコンストラクターがどのように定義されるかについては、多くの人が答えています。

JVMレベルでは、静的初期化子とコンストラクターはvoidを返すメソッドです。静的イニシャライザは静的メソッドですが、コンストラクタはthisを使用し、何も返す必要はありません。これは、呼び出し側がオブジェクトを作成する責任があるためです(コンストラクタではありません)。

コンストラクターを呼び出さずにバイトコードでのみオブジェクトを作成しようとすると、VerifyErrorが発生します。ただし、Oracle JVMでは、Unsafe.allocateInstance()を使用して、コンストラクターを呼び出さずにオブジェクトを作成できます。

静的イニシャライザーは<cinit>と呼ばれ、引数を取らず、コンストラクターは<init>と呼ばれます。どちらも戻り値の型がvoidです。

ほとんどの場合、これはJava開発者(バイトコードを生成している場合を除く)からは隠されています)が、スタックトレースでこれらの「メソッド」を表示するのは唯一の場合です(ただし、戻り型)

18
Peter Lawrey

コンストラクタはメソッドに似ていますが、メソッドではありません。これらには戻り値の型はなく、継承されず、サブクラスによって非表示にしたりオーバーライドしたりすることはできません。

コンストラクターは、クラスのインスタンス作成式(基本的にはnewの使用)、他のコンストラクターからの明示的な呼び出し(this(...)またはsuper(...)構文を使用)、および文字列連結演算子による。コンストラクターを呼び出す方法は他にありません(特に、他のメソッドのように呼び出すことはできません)。

詳細は Java言語仕様 のセクション8.8)を参照してください。

3
Ted Hopp

コンストラクタは、独自のクラスへの参照を返すメソッドに変換されますか?

いいえしかし、そうするように指定されている場合は、そうです。

コンパイラーは戻り値型を同じクラスへの参照をコンストラクターに追加しますか?

いいえそれはしません

コンストラクタはどうなっていますか?

これは、オブジェクトの作成時に実行されるメソッドです。通常、「新しい」キーワードを使用します。いくつかの予備的なタスクを実行したり、構築中に何かを返したり、いくつかの値を割り当てたりする場合があります。

これを研究するための参照。

3
Starx

コンストラクタはメソッドに似ていますが、クラスの名前を使用し、戻り値の型がない点が異なります。コンストラクターを使用する目的は、オブジェクト(クラスのインスタンス)を作成し、それを(newキーワードを介して)メモリ(ヒープ)に割り当て、使用可能な場合はフィールドを初期化することです。

2
Eng.Fouad

コンストラクターは、特別なJavaキーワードnewを介して呼び出されます。これは、指定された具象型のオブジェクトを作成(および初期化)します。

newと選択されたコンストラクターの組み合わせがオブジェクトを「返す」と言うことができると思いますJavaはもちろん、カバーの下のポインターです

1
Bohemian

コンストラクターの戻り型は、対応するクラス型です。

package com.ie.test;
import Java.lang.reflect.*;

public class a {
    public  a() {
        super();
        System.out.println("*** no-arg constructor ***");
    }

    public static void main(String[] args) {

        Constructor[] constructors =  a.class.getConstructors();

        for (Constructor constructor:constructors) {

            int i =  constructor.getModifiers();
            AnnotatedType annotatedType =  constructor.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            System.out.println("*******constructor *****"+Modifier.toString(i));
        }

        Method[] methods =  a.class.getDeclaredMethods();

        for (Method method:methods) {
            int i =  method.getModifiers();
            //  Class c =  method.getReturnType();
            AnnotatedType annotatedType =  method.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            //   System.out.println(c);
            System.out.println("*******methods*******"+Modifier.toString(i));
        }
    }

    public int m1() {
        System.out.println("***************");
        return 0;
    }
}
0

コンストラクターは、呼び出されているクラスのクラス参照を返します。

_class A {
    int x;
    A(int a) {
        x = a;
    }
}
class B {
    public static void main(String asd[]) {
        A a = new A(4);
        System.out.println(a);
    }
}
_

ここでコンストラクタA(...)を呼び出した後、このコンストラクタはクラスAのタイプの参照を呼び出し元に返します(つまり、A a = new A(4))。

0
vikasa