2

と呼ばれるParentClassクラスと呼ばれるクラスがあるとしますChildClass

ParentClass抽象的であり、Java ごとの用語をChildClass拡張します。ParentClassさらに、 にParentClassはパラメータとして を受け取るコンストラクタがありintます。今、別のクラスでインスタンス化したいと思いますChildClass。以下の2つの方法を試しました。

  1. ChildClass obj1 = new ChildClass(5)
  2. ParentClass obj2 = new ChildClass(5)

Java では、上記の 2 つの方法のいずれかを使用できます。私の質問は、実際に違いはありますか? 必要に応じて、2 つを同じ意味で使用できますか?

4

6 に答える 6

5

どちらも機能し、メモリ内に同じオブジェクトを作成します。ただし、最初のものだけは、ParentClass が認識していない ChildClass の追加の特定のプロパティまたはメソッドを使用できるようにします。

例 :

abstract class ParentClass{
   ...
}

class ChildClass extends ParentClass {

   public void SomeChildMethod(){ ... }
   ...
}

...


ChildClass obj1 = new ChildClass(5);
ParentClass obj2 = new ChildClass(5);

obj1.SomeChildMethod(); // ok
obj2.SomeChildMethod(); // compilation error 
((ChildClass)obj2).SomeChildMethod(); // ok

したがって、特定の子メソッドまたはプロパティが必要ないことが確実な場合にのみ、2 番目のインスタンス化メソッドを使用してください。

于 2013-02-01T10:39:45.863 に答える
2

作成されたオブジェクトは事実上同じです。

ChildClass最初のメソッドでは、ではなくで定義されたメソッドを使用できますParentClass。それで

   obj1.aMethodNotInParentClass();

コンパイル中に

   obj2.aMethodNotInParentClass();

ではない。

または、2番目の形式を使用すると、内部クラスを他の実装に簡単に置き換えることができます。AnotherChildClassの代わりに使用したい場合はChildClass

      ParentClass obj2 = new AnotherChildClass(5);

あなたがする必要があるすべての変更です(クラスが適切に定義されていると仮定します)。最初の方法を使用すると、コードの他の場所でいくつかの変更が必要になる可能性があります。

経験則として、変数を、オブジェクトに必要なすべてのメソッドを定義する(*)より一般的なクラスとして定義します。したがって、でChildClass定義されていない方法を使用ParentClassする場合は、最初の方法を使用します。それ以外の場合は、2番目の方法を使用します。

(*)実装ではなく、定義について言及していることに注意してください。のメソッドをオーバーライドする場合、作成されるオブジェクトはそのクラスのものであるため、その実装を使用します。ChildClass

于 2013-02-01T10:44:11.903 に答える
2

メモリでは、まったく同じオブジェクトが使用されます。ただし、変数を使用できるのは、クラスのすべての優れた機能を当然のことと見なさずに、オブジェクトがobj2含まれているかのようにのみです。メソッドを宣言しているが機能しない場合、呼び出しは機能しません-メモリ内のオブジェクトはメソッドを完全に実行できる可能性がありますが。ParentClassChildClassChildClassf()ParentClassobj2.f()

于 2013-02-01T10:44:59.370 に答える
1
  • 子が抽象メソッドを実装するだけで同じメソッドを持っている場合、違いはありません。
  • 追加のメソッドを子に追加した場合、親として宣言すると、それらにアクセスできなくなります。
于 2013-02-01T10:42:11.750 に答える
1

2 番目の選択肢は、ParentClass で宣言されたメソッドの使用のみを許可します。例えば:

public class ParentClass {
    public void doX() {}
}

public class ChildClass {
    public void doY() {}

    public static void main() {
        ParentClass p = new ChildClass();
        ChildClass c = new ChildClass();
        p.doX(); //works
        c.doX(); //works

        p.doY(); //not allowed
        c.doY(); //works


        ((ChildClass) p).doY(); //this way you cast the object to ChilClass and can use its methods.

    }
}
于 2013-02-01T10:45:42.850 に答える
0

はい、違いがあります。最初の方法では、動的バインディングを使用して、子インスタンスを親オブジェクトとして提供します。これは、親オブジェクトの機能を子インスタンスに与えるだけです。2 番目の方法では、子オブジェクトのインスタンスを子オブジェクトとして提供し、親クラスのメソッドに限定されるのではなく、そのメソッドとその親オブジェクトのメソッドをすべて使用できるようにします。

于 2013-02-01T17:20:25.760 に答える