知っているように、戻り値の型を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レベル、あるいはそれ以下でさえ答えを求めています。
Javaでコンストラクターがどのように定義されるかについては、多くの人が答えています。
JVMレベルでは、静的初期化子とコンストラクターはvoidを返すメソッドです。静的イニシャライザは静的メソッドですが、コンストラクタはthis
を使用し、何も返す必要はありません。これは、呼び出し側がオブジェクトを作成する責任があるためです(コンストラクタではありません)。
コンストラクターを呼び出さずにバイトコードでのみオブジェクトを作成しようとすると、VerifyErrorが発生します。ただし、Oracle JVMでは、Unsafe.allocateInstance()を使用して、コンストラクターを呼び出さずにオブジェクトを作成できます。
静的イニシャライザーは<cinit>
と呼ばれ、引数を取らず、コンストラクターは<init>
と呼ばれます。どちらも戻り値の型がvoidです。
ほとんどの場合、これはJava開発者(バイトコードを生成している場合を除く)からは隠されています)が、スタックトレースでこれらの「メソッド」を表示するのは唯一の場合です(ただし、戻り型)
コンストラクタはメソッドに似ていますが、メソッドではありません。これらには戻り値の型はなく、継承されず、サブクラスによって非表示にしたりオーバーライドしたりすることはできません。
コンストラクターは、クラスのインスタンス作成式(基本的にはnew
の使用)、他のコンストラクターからの明示的な呼び出し(this(...)
またはsuper(...)
構文を使用)、および文字列連結演算子による。コンストラクターを呼び出す方法は他にありません(特に、他のメソッドのように呼び出すことはできません)。
詳細は Java言語仕様 のセクション8.8)を参照してください。
コンストラクタは、独自のクラスへの参照を返すメソッドに変換されますか?
いいえしかし、そうするように指定されている場合は、そうです。
コンパイラーは戻り値型を同じクラスへの参照をコンストラクターに追加しますか?
いいえそれはしません
コンストラクタはどうなっていますか?
これは、オブジェクトの作成時に実行されるメソッドです。通常、「新しい」キーワードを使用します。いくつかの予備的なタスクを実行したり、構築中に何かを返したり、いくつかの値を割り当てたりする場合があります。
これを研究するための参照。
コンストラクタはメソッドに似ていますが、クラスの名前を使用し、戻り値の型がない点が異なります。コンストラクターを使用する目的は、オブジェクト(クラスのインスタンス)を作成し、それを(new
キーワードを介して)メモリ(ヒープ)に割り当て、使用可能な場合はフィールドを初期化することです。
コンストラクターは、特別なJavaキーワードnew
を介して呼び出されます。これは、指定された具象型のオブジェクトを作成(および初期化)します。
new
と選択されたコンストラクターの組み合わせがオブジェクトを「返す」と言うことができると思いますJavaはもちろん、カバーの下のポインターです
コンストラクターの戻り型は、対応するクラス型です。
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;
}
}
コンストラクターは、呼び出されているクラスのクラス参照を返します。
_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)
)。