2016-07-17 7 views
0

Ich versuche, ein Programm in Java, das eine Elternklasse RoundShapes und zwei Kinder Sphere und Cone hat, zu implementieren. Wenn ich versuche, einen Konstruktor in meinen Kindklassen zu machen, gibt es mir einen Fehler, dass der Konstruktor nicht auf diesen gegebenen Typ angewendet werden kann. Dann recherchierte ich und fand ein Tutorial zur Vererbung und sie verwendeten einen Superkonstruktor. Ich habe versucht, das zu verwenden, aber jetzt gibt es mir einen Fehler, dass Radius nicht vor dem Superkonstruktor verwendet werden kann ?! Ich war nicht im Rahmen des Konstruktors, also bin ich mir nicht sicher, was das anzeigt.Java-Vererbung Konstruktor Problem

import java.util.*; 

public class Miller_A03Q4 { 


    public static void main(String[] args) { 
     Sphere sphere1 = new Sphere(); 
     RoundShape cone1 = new RoundShape(); 
     RoundShape.setRadius(4); 

    } 




    public static class RoundShape{ 
     double area; 
     double volume; 
     double radius; 
     String shape;  
     //    
     public RoundShape(double r){ 

      radius = r; 

     } 
     // set radius method 
     public void setRadius(double r){ 
      radius = r; 
     } 
     // get area method 
     public double getArea(){ 
      return area; 
     } 
     // get volume 
     public double getVolume(){ 
      return volume; 


    } 
    } 
     // sphere is-a from roundshape 
    static class Sphere extends RoundShape{ 

     public Sphere(double r){ 
      radius = r; 

     } 
     //set area 
     public void setArea(){ 
     area = 4 * Math.PI * radius * radius; 

     } 






     // get volume 
     public void setVolume(){ 
     volume = (4/3) * Math.PI * radius * radius * radius;   

    } 

    } 

    //cone class is-a from roundshape 
    class Cone extends RoundShape{ 
     double height; 

     //set area 
     public void setArea(){ 
      area = Math.PI * radius * (radius + Math.sqrt(height * height + radius * radius)); 

    } 
// cone volume 
     public void setVolume(){ 
      volume = Math.PI * radius * radius * (height/3); 

    } 
} 


} 
+0

@AndrewL. Sie werden statische innere Klassen genannt und sind ein Sprachmerkmal. – 4castle

+0

@ 4castle wirklich? Ich denke du lernst jeden Tag etwas Neues – Li357

Antwort

0

Alle Konstrukteure machen einen Aufruf an ihre Super-Konstruktor der Klasse, bevor durch den Aufruf super() ihren eigenen Konstruktor aufrufen. Wenn Sie den Aufruf an super() weglassen, fügt es den Aufruf implizit ein.

In Ihrem Fall haben Sie keinen Konstruktor in Ihrer Superklasse angegeben, der 0 Parameter akzeptiert. Daher kann Java nicht ableiten, was die Parameter für super() sein sollten. Daher gibt es einen Compilerfehler und fordert Sie auf anzugeben was diese Parameter sein sollten.

Code zu beheben, haben Sie 2 Möglichkeiten

  1. einen Konstruktor in RoundShape erstellen, die 0 Parameter nimmt.
  2. Rufen Sie explizit super() an, in dem Sie die Parameter angeben.

Option # 2 würde so aussehen. Beachten Sie, dass der Aufruf an super() vor anderen Anweisungen kommen muss.

+0

@ 4castle Danke für die Hilfe! Ich hatte super (Radius) anstelle von super (r) .... smh. – rkstm

0

Dank den Anregungen in diesem Forum und einige zusätzliche Forschung, konnte ich mein Programm korrigieren. Ich hatte auch einige Laufzeitfehler in meinem ursprünglichen Code, der gepostet wurde, also wollte ich den aktualisierten Code zur Verfügung stellen, falls ein totaler Neuling wie ich darüber stolpert.

Einige Majors waren: 1. Ich musste setArea() und setVolume() Methoden nicht enthalten, sondern legte stattdessen die Formel in getArea() und getVolume(). 2. Ich musste nicht Volumen und Fläche in meinen Konstruktoren einschließen. 3. Ich habe auch eine toString() -Methode eingefügt, damit ich auf meine Daten zugreifen kann.

Ich bin sicher, das ist weit von der besten und effizientesten Code, aber es scheint zu funktionieren. Ich habe meinen neuen und aktualisierten Code als Referenz angegeben. Danke an alle, die meine dummen Fragen tolerieren!

import java.util.*; 

public class Miller_A03Q4 { 


    public static void main(String[] args) { 
     Sphere sphere1 = new Sphere(4); 
     Cone cone1 = new Cone(3,7); 
     System.out.println(cone1.toString()); 
     System.out.println(sphere1.toString()); 
     cone1.setHeight(10); 
     sphere1.setRadius(3); 
     System.out.println(cone1.toString()); 
     System.out.println(sphere1.toString()); 



    } 



// parent Roundhape 
    public static class RoundShape{ 
     double area; 
     double volume; 
     double radius; 
     String shape; 
     double height; 
     //    
     //constructor 
     public RoundShape(double r){ 

      radius = r; 

     } 
     // set radius method 
     public void setRadius(double r){ 
      radius = r; 
     } 
     // get area method 
     public double getArea(){ 
      return area; 
     } 
     // get volume 
     public double getVolume(){ 
      return volume; 


    } 
     //toString 
     public String toString(){ 
      return "Shape: " + shape +" Radius: " + radius + " Height: " 
        + height+ " Volume: " + this.getVolume() + " Area: "+ this.getArea(); 


     } 
    } 
     // sphere is-a from roundshape 
    public static class Sphere extends RoundShape{ 
     //constructor 
     public Sphere(double r){ 
      super(r); 
      radius = r; 
      shape = "sphere"; 


     } 
     //get area 
     public double getArea(){ 

       area = 4 * Math.PI * radius * radius; 
       return area; 
     } 
     // get volume 
     public double getVolume(){ 

      volume = 4 * Math.PI * (radius * radius * radius)/3; 
      return volume; 
    } 
    } 
    //cone class is-a from roundshape 
    public static class Cone extends RoundShape{ 

     // cone with radius and height 
     public Cone(double r, double h){ 
      super(r); 
      radius = r; 
      height = h; 
      shape = "cone"; 


     } 
     //set height 
     public void setHeight(double h){ 
      height = h; 
     } 
     // get area 
     public double getArea(){ 

       area = Math.PI * radius * (radius + Math.sqrt(height * height + radius * radius)); 
       return area; 
     } 
     // get volume 
     public double getVolume(){ 

      volume = Math.PI * radius * radius * (height/3); 
      return volume; 
    } 
} 


}