抽象クラスを拡張するサブクラス オブジェクトを作成すると、抽象クラス コンストラクターも実行されます。しかし、抽象クラスのオブジェクトを作成できないことはわかっています。したがって、コンストラクターが例外なく実行を完了しても、オブジェクトが作成されるかどうかは保証されないということですか?
8 に答える
したがって、コンストラクターが例外なく実行を完了しても、オブジェクトが作成されるかどうかは保証されないということですか?
簡単に言えば、 aconstructor
はオブジェクトを作成しません。オブジェクトの状態を初期化するだけです。オブジェクトを作成するのはオペレーターです。さて、これを少し詳しく理解しましょう。new
次のようなステートメントを使用してオブジェクトを作成する場合:
new MyClass();
オブジェクトは最初にnew
オペレーターによって作成されます。新しく作成されたオブジェクトへの参照が結果として返される直前に、指定されたコンストラクターが処理されて新しいオブジェクトが初期化されます。
Abstract class
次のようにすると、具体的な場合を考えてみSubClass
ましょう。
AbstractClass obj = new ConcreteClass();
new
演算子は のオブジェクトを作成し、ConcreteClass
そのコンストラクターを呼び出して、作成されたオブジェクトの状態を初期化します。このとき、抽象クラスのコンストラクターもConcreteClass
コンストラクターから呼び出され、抽象クラスのオブジェクトの状態を初期化します。
なので、基本的に のオブジェクトAbstractClass
は作成されません。オブジェクトの状態を初期化するためにコンストラクターが呼び出されるだけです。
得られた教訓:
オブジェクトは
new
、コンストラクター自体の呼び出しではなく、オペレーターによって作成されます。したがって、コンストラクターが呼び出される前に、オブジェクトは既に作成されています。コンストラクターは、作成されたオブジェクトの状態を初期化するためにのみ使用されます。オブジェクト自体は作成しません。
オブジェクトの状態は、抽象スーパー クラスに含めることもできます。
- したがって、
Abstract class
コンストラクターの呼び出しの目的は、オブジェクトを完全に初期化することだけであり、プロセス中にオブジェクトは作成されません。
見る:
しかし、抽象クラスのオブジェクトを作成することはできません。
そうですが、JVMは可能です。
コンストラクターが例外なく実行を完了したとしても、オブジェクトが作成されるかどうかの保証はないということですか?
オブジェクトは間違いなく内部で作成されます。
コンストラクターを呼び出すことは、オブジェクトを作成することを意味しますか?
常にではない。super()
を使用してコンストラクターを呼び出すことthis()
はできますが、オブジェクトはインスタンス化されません。(ただし、コンストラクターを呼び出すだけです)
class AClass
{
AClass()
{
this(1); // will invoke constructor, but no object instatiated.
}
AClass(int a)
{
}
public static void main(String[] args)
{
AClass obj = new AClass(); // one object instantiated.
}
}
例外を除いて、抽象クラスコンストラクターは、サブクラスのコンストラクター内からのみ実行されます(最初のステートメントとして)。したがって、コンストラクターが実行されるたびに、オブジェクトを作成していることを確認できます。
とはいえ、単一のオブジェクトを作成するプロセスで複数のコンストラクターを呼び出すことができます。たとえば、Subclass()
呼び出しSubclass(String)
をAbstractClass
介してsuper()
呼び出す呼び出しなどです。
Subclass == BaseClass + Extras you add in sub class
したがって、コンストラクターを呼び出してサブクラスを作成すると、基本クラスのコンストラクターも呼び出され、(基本クラスの) すべての属性も適切に初期化されます。
抽象クラスコンストラクターは、具象サブクラスコンストラクターの一部としてのみ呼び出すことができます。抽象クラスが具象クラスに拡張され、作成されているのはその具象クラスのオブジェクトであるため、これは問題ありません。
を使用してコンストラクターを呼び出すnew
と、新しいオブジェクトが作成されます。
さて、おそらくすでにご存じのとおり、サブクラスのすべてのコンストラクターは、暗黙的または明示的に、直接的または間接的に、親クラスからコンストラクターを呼び出します (次に、オブジェクトに至るまで、それ自体の親クラスからコンストラクターを呼び出します)。 )。これは、コンストラクターの連鎖と呼ばれます。
ただし、上記は複数のオブジェクトが作成されることを意味するものではありません。オブジェクトは呼び出し時に作成されておりnew
、そのオブジェクトで作業しているすべてのコンストラクターは既に割り当てられた領域を渡されています。したがって、コンストラクター チェーンは新しいオブジェクトを作成しません。を 1 回呼び出すと、new
1 つのオブジェクトが返されます。
これは、サブクラスのコンストラクターを呼び出すときの流れがどのように機能するかです。
- Abstract クラスのコンストラクターが実行されます --> オブジェクトはここで半分初期化されます。
- サブクラスのコンストラクターが実行を終了します --> オブジェクトは完全に初期化されているため、ここで完全に作成されます。
抽象クラスのオブジェクトを作成することはできず、jvm のみが継承の場合にそれを行うことができることに完全に同意しません。 : このコードを見て、自分で試してみてください
abstract class Amit{
void hai()
{System.out.print("Just Wanna say Hai");}
abstract void hello();
}
class Main{
stic public void main(String[]amit)
{
Amit aa=new Amit(){
void hello(){Sstem.out.print("I actually dont say hello to everyone");
}};
aa.hello(); }}