JAvaオブジェクト向けシリーズ1-3つの基本特徴


転載先  http://blog.csdn.net/hwalan/archive/2006/05/25/755251.aspx
 
オブジェクト向けの3つの基本的な特徴は、パッケージ、継承、およびマルチステートであることが知られている.
筆者が理解しているパッケージとは、ある物事の属性と行為を対象にパッケージすることであり、この対象は公開が必要な属性と行為だけを公表し、この公表も他の対象に選択的に公表することができる.Javaではprivate、protected、publicの3つの修飾子、すなわちデフォルトdefalutを使用して、外部オブジェクトのオブジェクトへのアクセスを制限できます.
筆者は継承は、子オブジェクトが親オブジェクトの属性と動作、すなわち親オブジェクトが持つ属性と動作を継承することができ、その子オブジェクトもこれらの属性と動作を持っていると考えている.これは自然の種遺伝によく似ている.
パッケージと継承は一般的に理解しやすいが,多態は理解できず,概念を間違えたり混同したりしやすい.次は主に筆者の多態に対する理解について述べる.
マルチステートといえば、リロード、オーバーロード、オーバーライド、書き換えなど、まずいくつかの語彙に言及する必要があります.筆者はこれらの語彙の意味を分析しないで、その上多態の中の内容に対して、すべての人はすべて自分の理解があって、その上すべてそれぞれの習慣の呼び方があって、まさに仁者は仁を見て、知者は智を見ます.筆者は仕事や学習で主にjavaを用いるため,javaにおける固定用法,すなわちoverriding(オーバーライド)とoverload(オーバーロード)を用いる傾向がある.マルチステートはoverriding(オーバーライド)に現れ、overload(オーバーロード)はオブジェクト向けマルチステートの範疇に属さない.overload(オーバーロード)概念は非オブジェクト向けにも存在するからである.
overload(オーバーロード)とは、同じ名前で異なる形式の関数を記述できることを意味し、C言語にもこのような特性があり、C言語はプロセス向けであり、オブジェクト向けではない.overload(過負荷)は、パラメータのタイプが一致しない、パラメータの個数が一致しない、異なるタイプのパラメータの順序が一致しないなど、異なる形式の同名関数に異なるパラメータリストが必要である.パラメータリストが同じで、関数の戻り値タイプが一致しないだけでは不正です.コンパイラは、どの戻りタイプの関数を使用すべきか判断できない可能性があります.次の例を参照してください.
         次の2つの関数プロトタイプがあります.
                    int count();
                    double count();
         プログラムでは、次のような方法で呼び出すことができます.
             1.  int iCount = count();
             2.  double dCount = count();
             3.  count();
         上記の1および2の呼び出し例では、コンパイラは呼び出すべき関数を判断して正しい選択をすることができるようになったが、3の呼び出しコンパイラにはどうしようもないことは明らかであり、3の書き方は完全に合法的であり、実際にはよく用いられる.
overriding(オーバーライド)は筆者が考えているオブジェクト向けの多態である.overriding(オーバーライド)は継承と密接に関連しており、オブジェクト向け特有であるからである.マルチステートとは、親オブジェクトの同じ動作が複数のサブオブジェクトで異なる表現を持つことを意味します.つまり、子オブジェクトは、親オブジェクトと他の子オブジェクトとは異なる表現を持つように、親オブジェクトの動作を書き換えることができます.これがoverriding(オーバーライド)です.この特性は自然遺伝の変異によく似ており、変異は自然を豊かにし、多態は対象に魔力を豊かにする.次は具体的な例を通じて多態の魔力を体得する.
            親Aがあります.
                  public class A {

                          public void methodA() {

                                  System.out.println("This is Parent of A.");

                          }

                  }
 
            親Aには、次の3つの子があります.
                  public class B1 {

                          public void methodA() {

                                  System.out.println("This is Children of B1.");

                          }

                  }

                  public class B2 {

                          public void methodA() {

                                  System.out.println("This is Children of B2.");

                          }

                  }

                  public class B3 {

                  }
 
             上のサブクラスB!B 2とも親AのメソッドmethodAを書き換えたが,B 3にはない.次に、実際の呼び出し文で見てみましょう.
              1.    A a1 = new A();
              2.   A a2 = new B1();
              3.    A a3 = new B2();
              4.    A a4 = new B3();
              5.    a1.methodA();
              6.    a2.methodA();
              7.    a3.methodA();
              8.    a4.methodA();
              上記の文の実行結果は次のとおりです.
                    This is Parent of A.
                    This is Children of B1.
                    This is Children of B2.
                    This is Parent of A.
             上記の実行結果から、5行目は親オブジェクトインスタンスへの参照呼び出しメソッドmethodAであり、実行も親メソッドであることがわかります.6行目、7行目はクラスAのオブジェクト参照呼び出しメソッドmethodAであるが、オブジェクト参照は対応するサブクラスオブジェクトのインスタンスを指すため、プログラムはサブクラスのメソッドを正しく実行し、曖昧さは生じない.8行目は、サブクラスオブジェクトB 3のインスタンスへの参照呼び出しメソッドmethodAであるが、サブクラスB 3はメソッドmethodAに対してoverriding(上書き)を行わず、つまり親の動作を直接継承しているため、実行結果は5行目と同様である.ここから私たちは簡単に多態の魔力を体得することができる.
今回はここまで書いておきますが、ひとまずレンガを投げて玉を引くのは、不適切な点を指摘してください.