2013-02-06 10 views
6

私はJavaを使ってオブジェクト指向プログラミングの特性を列挙したプロジェクトを作成する必要があります。カプセル化、多形性、および継承を特徴とする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."); 
    } 
} 
+3

あなたには継承とカプセル化がありますが、多型はありません。あなた自身のコードコメントは、その理由を説明しています:メソッドは同じ名前を持つ必要があります。それはしません。メソッドをオーバーライドする場合は、必ず@Overrideアノテーションを使用してください。 –

+2

オーバーロードがポリモーフィズムを提示する方法であるかどうかは不明です([おそらく](http://stackoverflow.com/questions/824763/is-polymorphism-another-term-for-overloading))。私があなたのことを知っていれば、私は[この例では](http://stackoverflow.com/questions/154577/polymorphism-vs-overriding-vs-overloading)のようにオーバーライドして表示しようとします。 – Pshemo

+2

また、getVal()は何も取得しないメソッドを呼び出すのではなく、代わりに出力します。 gettersとsetterは、Javaではよく確立された規約で​​あり、getVal()メソッドはゲッターのように名付けられますが、それは1つではありません。それがゲッターであれば、対応するセッターメソッド( 'setVal()')によって設定されたものを返します。 –

答えて

4

の線に沿って何かだろうあなたの多型例はに過負荷をかけるだけで方法であり、それはオブジェクト指向の人々が多型によって何を意味するか、実際にはありません。メソッドを公開するインターフェイスをどのように持つことができるかを意味し、interfaceを実装するさまざまなclassesがメソッドを実装して異なる動作を実装できます。

thisを参照してください。特に導入の最後の段落。

また、コード内のポリモーピズムの知識を実証する最良の方法は、ポリモーフィックオブジェクトを使用して異なるポリモーフビヘイビアを持つことができることを示すクライアントコードを必ず含むことをお勧めします。

+0

これははるかに明確になります。私は今、その違いを理解しています。ありがとう! – user2048643

4

物事のカップル:

  • ゲッターメソッドが値を返す必要があります。
  • オーバーロードとオーバーライドが異なります。多態性を実証するために、あなたの子クラスでsetVal()(あるいはもっと適切なメソッド)をオーバーライドしたいと思うかもしれません。

以下の例を参照してください。親はfooMethod()を実装しています。親はfooMethod(String str)を追加してfooMethod()をオーバーロードします。これらを2つの別々の完全に無関係な方法と考えてください。それらはちょうど非常によく似た見た目の名前を持っています。オーバーロードは多態性とは関係ありません。

次に、子は親を拡張します。子は最初に親から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() 
    } 
} 
1

あなたのオーバーライドの例は正しくありません(ポリモルフィズムを示すものではありません)。

異なる署名を持つ2つの関数を表示します(引数の型は関数の署名の一部です)。それらが同じ名前を持っているという理由だけで、それらを上書きの例にしていません。クラスの子がそのスーパー(親)クラスのSETVAL(int)メソッドをオーバーライドします

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

のようなものを持っていた場合

オーバーライドは次のようになります。

しかし多型を実証するためのより良い方法が

Parent guy = new Child(); 
guy.getVal(); 
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(); 
    } 
} 
関連する問題