6

Java を使用したオブジェクト指向プログラミングのリストされた特性を備えたプロジェクトを作成する必要があります。

これらの特性がどのように実装されているかを理解し、それらがすべて存在し、正しく実行されていることを確認するために、誰かが私の簡単なサンプル プログラムを調べてくれませんか?

package Example;

public class Parent {

    private int a;
    public void setVal(int x){
        a = x;
    }
    public void getVal(){
        System.out.println("value is "+a);
    }
}

public class Child extends Parent{

    //private fields indicate encapsulation
    private int b;
    //Child inherits int a and getVal/setVal methods from Parent
    public void setVal2(int y){
        b = y;
    }
    public void getVal2(){
        System.out.println("value 2 is "+b);
    }
    //having a method with the same name doing different things
    //for different parameter types indicates overloading,
    //which is an example of polymorphism
    public void setVal2(String s){
        System.out.println("setVal should take an integer.");
    }
}
4

4 に答える 4

4

あなたのポリモーフィズムの例は単にメソッドのオーバーロードであり、それは実際にはオブジェクト指向の人々がポリモーフィズムによって意味するものではありません。これらは、メソッドを公開するインターフェイスと、メソッドclassesを実装interfaceしてさまざまな動作を行うことができるさまざまな実装方法を実現する方法を意味します。

これを参照してください。特に紹介の最後の段落。

また、コードでポリモーフィズムの知識を示す最良の方法には、ポリモーフィックオブジェクトを使用して、異なる動作、つまりポリモーフィズムの動作を示すことができるクライアントコードを含める必要があることをお勧めします。

于 2013-02-06T22:06:13.227 に答える
4

いくつかのこと:

  • Getter メソッドは値を返す必要があります。
  • オーバーロードはオーバーライドとは異なります。おそらく、ポリモーフィズムを示すために、子クラスで setVal() (または他のより適切なメソッド) をオーバーライドする必要があります。

以下の例を参照してください。親は fooMethod() を実装します。次に、親は fooMethod(String str) を追加して fooMethod() をオーバーロードします。これらは、まったく無関係な 2 つの別個のメソッドと考えてください。たまたま非常によく似た名前が付いているだけです。オーバーロードはポリモーフィズムとは何の関係もありません。

次に、Child が Parent を拡張します。子は最初に親から fooMethod を継承しますが、fooMethod() が呼び出されると別の機能が必要になります。そのため、 Child は独自の実装で fooMethod() をオーバーライドします。Child のオブジェクトが fooMethod() を呼び出すと、子バージョンの fooMethod() が実行され、「foo」ではなく「bar」が出力されます。

public class Parent {
  public void fooMethod() {
    System.out.println("foo");
  }

  public void fooMethod(String str) {  // overloading Parent.fooMethod()
    System.out.println("foo " + str);
  }
}


public class Child extends Parent {
  public void fooMethod() {
    System.out.println("bar");  // overriding Parent.fooMethod()
  }
}
于 2013-02-06T22:02:27.160 に答える
1

オーバーライドの例は正しくありません (例のように、ポリモーフィズムを示していません)。

異なるシグネチャを持つ 2 つの関数を示します (引数の型は関数シグネチャの一部です)。名前が同じだからといって、オーバーライドの例にはなりません。

クラスの子が次のようなものを持っている場合、オーバーライドは

public void setVal(int x){
    a = x+10;
}

これは、スーパー (親) クラスの setVal(int) メソッドをオーバーライドします。

ただし、ポリモーフィズムを示すより良い方法は、次のようなものです。

Parent guy = new Child();
guy.getVal();
于 2013-02-06T22:02:46.097 に答える
1
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
class Parent_1
{
    private int i;//encap
    private int j;

    public  void display() {            
        System.out.println("these are the 2 answer");
    }
}

class child extends Parent_1   //inher
{
    public void display()  //method overiding
    {
        System.out.println("this is for method overriding");
    }

    public void mul(int i, int j)
    {
        int k=i*j;
        System.out.println("mul of 2 int val is:"+k);
    }

    public void mul(double i,double j)  //poly
    {
         double z=i*j;
         System.out.println("mul val of 2 double is:"+z);
    }
}

class Son
{
    public static void main(String args[])
    {
         Parent_1 p=new Parent_1();

         Parent_1 pt=new child();
         child cd=new child();
         p.display();
         cd.mul(2, 20);
         cd.mul(2.2, 1.1);
         pt.display();
    }
}
于 2013-10-17T10:19:25.153 に答える