16

抽象クラスを拡張するサブクラス オブジェクトを作成すると、抽象クラス コンストラクターも実行されます。しかし、抽象クラスのオブジェクトを作成できないことはわかっています。したがって、コンストラクターが例外なく実行を完了しても、オブジェクトが作成されるかどうかは保証されないということですか?

4

8 に答える 8

21

したがって、コンストラクターが例外なく実行を完了しても、オブジェクトが作成されるかどうかは保証されないということですか?

簡単に言えば、 aconstructorはオブジェクトを作成しません。オブジェクトの状態を初期化するだけです。オブジェクトを作成するのはオペレーターです。さて、これを少し詳しく理解しましょう。new

次のようなステートメントを使用してオブジェクトを作成する場合:

new MyClass();

オブジェクトは最初にnewオペレーターによって作成されます。新しく作成されたオブジェクトへの参照が結果として返される直前に、指定されたコンストラクターが処理されて新しいオブジェクトが初期化されます。


Abstract class次のようにすると、具体的な場合を考えてみSubClassましょう。

AbstractClass obj = new ConcreteClass();

new演算子は のオブジェクトを作成し、ConcreteClassそのコンストラクターを呼び出して、作成されたオブジェクトの状態を初期化します。このとき、抽象クラスのコンストラクターもConcreteClassコンストラクターから呼び出され、抽象クラスのオブジェクトの状態を初期化します。

なので、基本的に のオブジェクトAbstractClassは作成されません。オブジェクトの状態を初期化するためにコンストラクターが呼び出されるだけです。

得られた教訓:

  • オブジェクトはnew、コンストラクター自体の呼び出しではなく、オペレーターによって作成されます。したがって、コンストラクターが呼び出される前に、オブジェクトは既に作成されています。

  • コンストラクターは、作成されたオブジェクトの状態を初期化するためにのみ使用されます。オブジェクト自体は作成しません。

  • オブジェクトの状態は、抽象スーパー クラスに含めることもできます。

  • したがって、Abstract classコンストラクターの呼び出しの目的は、オブジェクトを完全に初期化することだけであり、プロセス中にオブジェクトは作成されません。

見る:

于 2013-01-22T07:14:25.270 に答える
3

しかし、抽象クラスのオブジェクトを作成することはできません。

そうですが、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.
    }
}
于 2013-01-22T07:12:15.520 に答える
2

例外を除いて、抽象クラスコンストラクターは、サブクラスのコンストラクター内からのみ実行されます(最初のステートメントとして)。したがって、コンストラクターが実行されるたびに、オブジェクトを作成していることを確認できます。

とはいえ、単一のオブジェクトを作成するプロセスで複数のコンストラクターを呼び出すことができます。たとえば、Subclass()呼び出しSubclass(String)AbstractClass介してsuper()呼び出す呼び出しなどです。

于 2013-01-22T07:10:27.720 に答える
2

Subclass == BaseClass + Extras you add in sub class

したがって、コンストラクターを呼び出してサブクラスを作成すると、基本クラスのコンストラクターも呼び出され、(基本クラスの) すべての属性も適切に初期化されます。

于 2013-01-22T07:13:17.797 に答える
0

抽象クラスコンストラクターは、具象サブクラスコンストラクターの一部としてのみ呼び出すことができます。抽象クラスが具象クラスに拡張され、作成されているのはその具象クラスのオブジェクトであるため、これは問題ありません。

于 2013-01-22T07:10:19.763 に答える
0

を使用してコンストラクターを呼び出すnewと、新しいオブジェクトが作成されます。

さて、おそらくすでにご存じのとおり、サブクラスのすべてのコンストラクターは、暗黙的または明示的に、直接的または間接的に、親クラスからコンストラクターを呼び出します (次に、オブジェクトに至るまで、それ自体の親クラスからコンストラクターを呼び出します)。 )。これは、コンストラクターの連鎖と呼ばれます。

ただし、上記は複数のオブジェクトが作成されることを意味するものではありません。オブジェクトは呼び出し時に作成されておりnew、そのオブジェクトで作業しているすべてのコンストラクターは既に割り当てられた領域を渡されています。したがって、コンストラクター チェーンは新しいオブジェクトを作成しません。を 1 回呼び出すと、new1 つのオブジェクトが返されます。

于 2013-01-22T07:14:11.587 に答える
0

これは、サブクラスのコンストラクターを呼び出すときの流れがどのように機能するかです。

  1. Abstract クラスのコンストラクターが実行されます --> オブジェクトはここで半分初期化されます。
  2. サブクラスのコンストラクターが実行を終了します --> オブジェクトは完全に初期化されているため、ここで完全に作成されます。
于 2013-01-22T07:12:30.763 に答える
0

抽象クラスのオブジェクトを作成することはできず、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(); }}
于 2013-12-05T11:16:00.090 に答える