2013-02-06 12 views
6

Ich muss ein Projekt mit den aufgeführten Eigenschaften der objektorientierten Programmierung mit Java erstellen.Java-Beispiel mit Kapselung, Polymorphie und Vererbung?

Könnte jemand über mein schnelles Beispielprogramm schauen, um zu bestätigen, dass ich verstehe, wie diese Merkmale implementiert sind und dass sie alle vorhanden und korrekt ausgeführt sind?

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

Sie haben Vererbung und Einkapselung, aber Sie haben keinen Polymorphismus. Ihr eigener Code-Kommentar erklärt warum: Die Methode sollte den gleichen Namen haben. Es tut es nicht. Verwenden Sie immer die Annotation @Override, wenn Sie eine Methode überschreiben möchten. –

+2

Nicht sicher, ob Überladung eine Möglichkeit ist, Polymorphismus zu präsentieren ([wahrscheinlich nicht] (http://stackoverflow.com/questions/824763/is-polymorphism-another-term-for-overloading)). Wenn ich dich habe, würde ich versuchen, es mit einem Override wie in [diesem Beispiel] darzustellen (http://stackoverflow.com/questions/154577/polymorphism-vs-overriding-vs-overloading). – Pshemo

+2

Rufen Sie auch nicht 'getVal()' eine Methode auf, die nichts erhält, sondern sie stattdessen ausgibt. Getter und Setter sind eine etablierte Konvention in Java, und Ihre Methode getVal() wird wie ein Getter benannt, ist aber keiner. Wenn es ein Getter wäre, würde es zurückgeben, was durch die entsprechende Setter-Methode ('setVal()') eingestellt wurde. –

Antwort

4

Ihr Polymorphismus Beispiel sein ist lediglich Methode Überlastung und das ist nicht wirklich, was die Object Oriented Leute durch Polymorphismus bedeuten. Sie bedeuten, wie Sie eine Schnittstelle haben, die eine Methode verfügbar macht, und die verschiedenen classes, die implementieren interface können die Methode implementieren, um unterschiedliche Verhaltensweisen zu haben.

Siehe this. Letzter Absatz der Einleitung im Besonderen.

Auch würde ich vorschlagen, dass der beste Weg, um Wissen über Polymorphismus in Code zu demonstrieren, notwendigerweise Client-Code enthalten würde, der die polymorphen Objekte verwendet, um zu demonstrieren, dass sie unterschiedliche, d.

+0

Dies macht es viel klarer; Ich verstehe den Unterschied jetzt. Vielen Dank! – user2048643

4

Ein paar Dinge:

  • Getter Methode sollte Werte zurückgeben.
  • Überladung unterscheidet sich vom Überschreiben. Wahrscheinlich wollen Sie setVal() (oder vielleicht eine andere, geeignetere Methode) in Ihrer Kindklasse überschreiben, um Polymorphie zu demonstrieren.

das folgende Beispiel. Eltern implementiert fooMethod(). Parent überlädt dann fooMethod(), indem fooMethod (String str) hinzugefügt wird. Betrachten Sie diese als zwei getrennte, völlig unabhängige Methoden - sie haben zufällig sehr ähnlich aussehende Namen. Überladen hat nichts mit Polymorphie zu tun.

Dann Kind erweitert Parent. Child erbt fooMethod zunächst von Parent, benötigt jedoch andere Funktionen, wenn fooMethod() aufgerufen wird. So überschreibt Child fooMethod() mit einer eigenen Implementierung. Wenn nun ein Objekt von Child fooMethod() aufruft, wird die Child-Version von fooMethod() ausgeführt, wobei "bar" und nicht "foo" gedruckt wird.

1

Ihr Beispiel für das Überschreiben ist falsch (wie in, zeigt keinen Polymorphismus).

Sie zeigen zwei Funktionen mit unterschiedlichen Signaturen (die Typen der Argumente sind Teil der Funktionssignatur). nur weil sie den gleichen Namen haben, machen sie sie nicht zu einem Beispiel für das Überschreiben.

überwiegende wäre, wenn Klasse Kind so etwas wie

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

die die setval (int) -Methode in seiner Super (übergeordnete) Klasse außer Kraft setzen würden.

jedoch ein besserer Weg, Polymorphismus zu demonstrieren würde etwas entlang der Linien von

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(); 
    } 
}