Methoden Brauche Hilfe beim erstellen folgender Methode ..

Gyng

Mitglied
Hallo Leute,

ich bereite mich auf meine bald anstehende Java Klausur vor und übe schonmal etwas dafür. Das hier ist ein Ausschnitt aus der Probeklausur vom letzten Semester.

Die Methode hit(Vessel v) feuert einen Photonentorpedo auf das Vessel v ab (den Gegner). Die Methode hat ebenfalls keinen Rückgabewert und verändert die Integrität des Gegners (d.h. dessen Attribut integrity) nach folgender
Formel: Integrität des Gegners – 10 * Stärke des eigenen Torpedos.

Jetzt bin ich mir aber nicht ganz sicher.. muss ich zuerst in der Methode
Code:
void hit(Vessel v){
//Code
}
ein Objekt(also das Gegner Schiff) erstellen um dann die Formel : integrity - (10 * torpedoStrength) darauf anwenden oder schreibe ich in die Methode nur die Formel und erstelle später in meiner main-Methode ein Objekt z.b (Vessel gegnerschiff = new Vessel(*werte*)?

Hoffe mir kann jemand auf die Sprünge helfen.. :/
 

Joose

Top Contributor
Deine Methode hat laut Angabe einen Parameter "v" vom Typ Vessel. Sprich es sollte ein Vessel Objekt an die Methode übergeben werden.

Ich zitiere die Angabe:
Die Methode hit(Vessel v) feuert einen Photonentorpedo auf das Vessel v (den Gegner) ab
(habe hinten nur die Wörter vertauscht damit es klarer wird.
 

Gyng

Mitglied
Java:
public void hit(Vessel v){
v.integrity -= (10 * torpedoStrength);
}

integrity bezieht sich ja nun auf mein Parameter v und davon subtrahiere ich die Stärke meines Torpedos.
Allerdings meldet eclipse den Fehler "this field is not visible".. Wo liegt mein Fehler ?
 

Gyng

Mitglied
Sorry ! Ich werden mal die gesamte Aufgabenstellung + meinen bisherigen Code posten.
*Achtung, langer Post* *Fragen ganz unten*

Um eine Episode aus Startrek zu modellieren benötigen Sie verschiedene
Klassen, die sich jeweils in eigenen Modulen (Packages) befinden. Wir
betrachten für diese Aufgabe nur das Package vessels .

Hinsichtlich der Zugriffsrechte sind alle Klassen und Schnittstellen, die wir nun
betrachten, öffentlich.

Die Schnittstelle Destroyable befindet sich im Package vessels . Destroyable schreibt folgende öffentliche
Methode vor: • destroy(Vessel v) ohne Rückgabewert. Die Methode erreicht die Zerstörung eines Raumschiffs, indem die Integrität der
Außenhülle zerstört wird. Anders gesagt: die integrity des Schiffes Vessel v wird auf 0 gesetzt.

Die Klasse Vessel ist eine abstrakte Klasse mit den folgenden privaten Attributen:
• torpedos ist ein Attribut vom Typ int und beschreibt wie viele Photonentorpedos an Bord sind.
• torpedoStrength ist ein Attribut vom Typ double und beschreibt, wie stark die Zerstörungskraft der Torpedos ist.
• warp gibt die Geschwindigkeit an und ist vom Typ int.
• Das Attribut integrity ist vom Typ int und gibt den Schutz durch das integritätsfeld an (100 ist voll funktionsfähig, 0 bedeutet, dass das
Schiff zerstört ist).
• Der Name des Schiffes ist im Attribut id gespeichert und ist vom Typ String . id ist eine Konstante, die
später nicht mehr verändert werden kann.

* und den folgenden öffentlichen Methoden, sofern die Zugriffsrechte nicht explizit anders gefordert sind:
• Die Klasse besitzt einen allgemeinen Konstruktor, der für alle Attribute Werte entgegennimmt und die Attribute damit initialisiert.
Der Konstruktor soll nur von den Klassen des eigenen Package und von abgeleiteten Klassen aus anderen Packages aufgerufen werden können.

• Die Methode hit(Vessel v) feuert einen Photonentorpedo auf das Vessel v ab (den Gegner). Die Methode hat ebenfalls keinen Rückgabewert und verändert die
Integrität des Gegners (d.h. dessen Attribut integrity ) nach folgender Formel: Integrität des Gegners – 10 * Stärke des eigenen Torpedos.

•Die Methode setIntegrity(int integrity) hat ebenfalls keinen Rückgabewert. Das Attribut integrity übernimmt den Wert des formalen Parameters integrity .
Die Methode soll nur im eigenen Paket aufgerufen werden können.

• Außerdem verfügt die Klasse über die Methode toString() , die alle Attributwerte als String zurückgibt.

Die konkrete Klasse Enterprise ist von Vessel abgeleitet und implementiert die Schnittstelle Destroyable und befindet sich im
Package vessels. Die Klasse verfügt über die folgenden öffentlichen Methoden (sofern nicht anders gefordert):
• Enterprise verfügt über einen privaten allgemeinen Konstruktion.
•Die Klassenmethode makeEnterprise(int torpedos, double torpedoStrength) liefert ein Objekt vom Typ Enterprise zurück. Die übrigen Attribute werden
mit den folgenden Werten belegt: warp hat den Wert 10, integrity den Wert 100 und die id ist “NCC-1701”. Die Klasse implementiert die Methode destroy(Vessel v) der
Schnittstelle Destroyable gemäß Beschreibung

So, nun mein Code der so gut wie fertig ist.. es müssen nur ein paar Fehler ausgemerzt werden..
Zuerst das interface Destroyable :
Java:
package vessels;
public interface Destroyable {
    void destroy(Vessel v); //erreicht die Zerstörung des Schiffes (integrity = 0)
}
Nun die abstrakte Klasse Vessel:
Java:
package vessels;

public abstract class Vessel {

    //Attribute
    private int torpedos; // Anzahl der verfügbaren Torpedos
    private double torpedoStrength; // Stärke der Torpedos
    private int warp; // Geschwindigkeit des Schiffes
    private int integrity; //Schutz des Schiffes .. 0 = zerstört 100 = voll funktionsfähig
    private static final String id; //Name des Schiffes, der später nicht mehr verändert werden kann.

    //allgemeiner Konstruktor
    protected Vessel(int torpedos, double torpedoStrength, int warp, int integrity, String id){
        this.torpedos = torpedos;
        this.torpedoStrength = torpedoStrength;
        this.warp = warp;
        this.integrity = integrity;
        if(integrity > 100)
            integrity = 100;
        if(integrity < 0)
            integrity = 0;
        this.id = id;
    }

    //Methode
    void hit(Vessel v){
        v.integrity -= (10 * torpedoStrength);
    }

    //setter
     void setIntegrity(int integrity){
        integrity = integrity;
    }
 
     //toString Methode
     public String toString(){
         return "Anzahl Torpedos: " + torpedos + " Stärke Torpedos: " + torpedoStrength + " Geschwindigkeit: " + warp +
                 " Schutz des Schiffes: " + integrity + " Name des Schiffes: " + id;
             
     }
}
Und die Klasse Enterprise die von Vessel erbt und die Schnittstelle implementiert:
Java:
package vessels;

public class Enterprise extends Vessel implements Destroyable{

    //algemeiner Konstruktor
    private Enterprise(int torpedos, double torpedoStrength, int warp, int integrity, String id){
        super(torpedos, torpedoStrength, warp, integrity, id);
    }

    static void makeEnterprise(int torpedos, double torpedoStrength){
        Enterprise neuesSchiff = new Enterprise(5,4.0,10,100,"NCC-1701"); // torpedos = 5, torpedoStrength = 4.0, warp = 10, integrity = 100, id = "NCC-1701";
    }
    public void destroy(Vessel v){
        v.setIntegrity(0);
    }

}

1. Frage : Das Attribut String id ist zum einem static und final. allerdings bekommt es zu Anfang ja nichts zugewiesen.Deshalb meldet mir eclipse auch einen Fehler(id may not been inizialized). Was kann ich dagegen tun ? Laut Aufgabe soll es keinen Wert bekommen.. anfangs.

2.Frage : Sind meine Methoden void hit(Vessel v) und destroy(Vessel v) korrekt ?

3.Frage : Macht die set-Methode wie ich sie habe überhaupt einen Sinn ? Schließlich sage ich ja einfach integrity = integrity ..

So ich bedanke mich schonmal an alle die bis hierhin durchgehalten haben und auch noch bereit sind mir zu Antworten :)
Danke im Vorraus.
 
Zuletzt bearbeitet:

Bitfehler

Bekanntes Mitglied
Die Klassenmethode makeEnterprise(int torpedos, double torpedoStrength) liefert ein Objekt vom Typ Enterprise zurück.

Deine Methode ist eine void und liefert nichts zurück.

Laut Aufgabe ist eine integrity von 0 gleich der Zerstörung eines Schiffes. Deine kann auch negative Zahlen annehmen, was erstmal nicht falsch ist. Je nachdem wer das korrigiert, könnte aber der Ansicht sein, das eine negative integrity nicht gewünscht war.
 

thecain

Top Contributor
1. Bist du sicher, dass du das Feld static willst und nicht nur final?

2. willst du mit destroy dich selber zerstören oder das andere?
im moment würdest du das andere zerstören, aber auch nur wenn du statt

Code:
integrity = integrity

Code:
this.integrity = integrity
in der setIntegrity schreibst

das selbe bei den beiden if (wenn über 100, wenn unter 0)
 

Gyng

Mitglied
Deine Methode ist eine void und liefert nichts zurück.

Laut Aufgabe ist eine integrity von 0 gleich der Zerstörung eines Schiffes. Deine kann auch negative Zahlen annehmen, was erstmal nicht falsch ist. Je nachdem wer das korrigiert, könnte aber der Ansicht sein, das eine negative integrity nicht gewünscht war.

Okay.. ich habe das void jetzt entfernt und versucht das Objekt zurückzuliefern. Allerdings bekomme ich den Fehler "return type for the method is missing". Außerdem ging ich davon aus das die if Anweisung in meinem allgemeinen Konstruktor ausreicht ?

P.S das wird von niemanden kontrolliert. Es ist eine alte Klausuraufgabe die ich zur Prüfungsvorbereitung nutze ;) Hab ich weiter oben auch schon geschrieben.

Java:
static makeEnterprise(int torpedos, double torpedoStrength){
        Enterprise neuesSchiff = new Enterprise(torpedos,torpedoStrength,10,100,"NCC-1701");
        return neuesSchiff;
    }
Was mache ich falsch ?

1. Bist du sicher, dass du das Feld static willst und nicht nur final?

2. willst du mit destroy dich selber zerstören oder das andere?
im moment würdest du das andere zerstören, aber auch nur wenn du statt

Code:
integrity = integrity

Code:
this.integrity = integrity
in der setIntegrity schreibst

das selbe bei den beiden if (wenn über 100, wenn unter 0)

1.Ich ging davon aus, da in der Aufgabe von einer Konstanten gesprochen wird die später nicht mehr verändert werden kann. Daher dachte ich das static final die richtige Antwort ist. Ich habe das static jetzt entfernt und nun ist auch die Fehlermeldung weg.

2.Ich möchte natürlich nicht mich sondern das andere Schiff zerstören :D. Okay ich hab das jetzt mal so korrigiert. Jetzt ist auch der Fehler beim setter weg also danke schonmal !
Java:
protected Vessel(int torpedos, double torpedoStrength, int warp, int integrity, String id){
        this.torpedos = torpedos;
        this.torpedoStrength = torpedoStrength;
        this.warp = warp;
        this.integrity = integrity;
        if(this.integrity > 100)
            integrity = 100;
        if(this.integrity < 0)
            integrity = 0;
        this.id = id;
    }
C:
//setter
     void setIntegrity(int integrity){
        this.integrity = integrity;
    }
 

Bitfehler

Bekanntes Mitglied
Eine Methode wird folgendermaßen deklariert: Rückgabetyp + Methodenname + Übergabeparameter
Deine Methode hat nach dem Entfernen von void keinen Rückgabetyp mehr. Mögliche Rückgabetypen wären void, double, String, ... oder auch Enterprise.
 

thecain

Top Contributor
Der Teil im Konstruktor müsste so sein:

Java:
this.integrity= integrity;
       if(this.integrity>100)
            this.integrity =100;
       if(this.integrity<0)
            this.integrity =0;
       this.id= id;
 

Gyng

Mitglied
Ahh, danke dir(@thecain) vielmals !
Ich überarbeite mal diesen Post ...
Java:
static Enterprise makeEnterprise(int torpedos, double torpedoStrength){
        Enterprise neuesSchiff = new Enterprise(torpedos,torpedoStrength,10,100,"NCC-1701"); // torpedos = 5, torpedoStrength = 4.0, warp = 10, integrity = 100, id = "NCC-1701";
        return neuesSchiff;
    }

Ich habe also das getan was @Bitfehler vorgeschlagen hatte. Aber jetzt verstehe ich nicht ganz warum Enterprise funktioniert. Könnte mir das noch jemand erklären wenns nicht zu viel verlangt ist ? :/
 
Zuletzt bearbeitet:

thecain

Top Contributor
Da du den Konstruktor private hast, kannst du kein Enterprise von aussserhalb erstellen. Durch die statische Methode kannst du dies dann. Im Englischen nennt sich das dann "static Factory Method" unter dem Stichwort findest du mit Google auch genauere Infos.

Du kannst nun also wie folgt ein neues Enterprise erstellen:

Java:
Enterprise myEnterprise = Enterpise.makeEnterprise(5, 5.5);
 

Gyng

Mitglied
Alles klar, das mit der "static Factory Method" schau ich mir nochmal genauer an.
Zuerst möchte ich mich bei euch beiden aber bedanken. Ihr habt mir sehr weitergeholfen
Wünsche euch noch einen guten Rutsch ins neue Jahr ;)

Gruß Andreas
 

Neue Themen


Oben