2016-04-03 4 views
-1

Ich habe 3 Klassen und ich habe eine Methode in meiner Rechteckklasse, die überprüft, ob die Höhe und Breite gleich lang sind. Wenn ich jedoch die Höhe und Breite in meiner Dreiecksklasse festlege und meine Dreiecksklasse erlasse, heißt das Die Methode rectangle isSquare() ist wahr, weil sie die Standardwerte 0.0 und 0.0 verwendet. Wie kommt es, dass es nicht das erbt, was ich in der Dreiecksklasse zugewiesen habe?Erben einer Klassenvariablenwerte in Java?

class inheritence { 
    private double width; 
    private double height; 
    public void setHeight(double height){ 
     this.height=height; 
    } 
    public double getHeight(){ 
     return height; 
    } 
    public void setWidth(double width){ 
     this.width=width; 
    } 
    public double getWidth(){ 
     return width; 
    } 
    void showDim(){ 
     System.out.println("Width and height are "+width+" and "+height); 
    } 
} 

class Triangle extends inheritence{ 
    String style; 
    double area(){ 
     return getHeight()* getWidth(); 
    } 
    void showStyle(){ 
     System.out.println("Triangle is "+style); 
    } 
} 

public class Rectangle extends Triangle{ 
    boolean isSquare(){ 
     if(getWidth()==getHeight()){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    public double area(){ 
     return getWidth()*getHeight(); 
    } 
} 

public class Driver { 
    public static void main(String[]args){ 
     Triangle t1=new Triangle(); 
     Triangle t2=new Triangle(); 
     Rectangle rect=new Rectangle(); 
     t1.setHeight(10); 
     t1.setWidth(20); 
     if(rect.isSquare()){ 
      System.out.println("Its a square!"); 
     }else{ 
      System.out.println("Its not a square"); 
     } 

     System.out.println(t1.getHeight()); 
     System.out.println(t1.getWidth()); 
     t1.showDim(); 
     System.out.println("The area for t1 is "+t1.area()); 
     t1.style="Outlined"; 
     t1.showStyle(); 
    } 
} 
+0

Es sollte zunächst wahr sein. Sobald Sie die Eigenschaften Breite und Höhe geändert haben, kann es anders sein. Und ein Rectangle ist keine Art von Triangle, also ist das keine besonders gute Klassierungsstruktur. – ManoDestra

+4

... Ein Rechteck ist ** definitiv NICHT ** ein Dreieck, also ist deine Vererbungsstruktur falsch zu sein (und Formen sind sowieso traditionell problematisch). Auch die Fläche für ein Dreieck wäre falsch. –

+0

Lol, ich weiß, es ist schrecklich Classing Struktur, aber ich frage mich, warum es nicht funktioniert – Eli

Antwort

3

Sie sind die width und height in einer Instanz der Klasse Triangle (t1) Einstellung, sondern rufen Sie den Scheck rect.isSquare() auf eine andere Instanz (die eine Rectangle passiert sein), für die Sie nicht die width und height gesetzt haben, so blieben sie 0.

Die width und height Mitglieder sind beispielsweise Mitglieder (sie sind nicht statisch), was bedeutet, Jede Instanz Ihrer class inheritence-Klasse würde andere Werte für sie haben, so dass ihre Festlegung in einer Instanz ihre Werte in anderen Instanzen nicht beeinflusst.

1

Sie setzen Höhe und Breite für das Objekt t1 anstelle des Objekts rect. Wenn Sie es einrichten Objekt rect dann die Ausgabe Its not a square

rect.setHeight(10); 
    rect.setWidth(20); 

zeigen Da Sie Werte erben, Sie im Grunde brauchen keine separaten Dreieck Objektinstanzen mit zu arbeiten. Sie können einfach mit 1 Objekt arbeiten, d. H. rect

+0

Vererbt er also die Werte der Objekte nicht? – Eli

+0

Da Sie Eigenschaften nach dem Vererbungsprinzip von OOPs erben, benötigen Sie im Grunde keine separaten Dreiecksobjekt-Instanzen ('t1' oder' t2'), mit denen gearbeitet werden kann. Sie können einfach mit 1 Objekt arbeiten, dh ("rect") Da "rect" eine Objektinstanz von 'Rectangle' ist, wird es Eigenschaften von' Triangle' und 'Triangle' übernehmen. Inturn, übernimmt Höhe und Breite von' Vererbung' Klasse . –