Vererbung, abstract und Konstruktoren

werdas34

Bekanntes Mitglied
Hallo,

ich habe eine abstract Klasse mit einem Konstruktor. Und von dieser Klasse erben andere Klassen.

Damit das funktioniert, muss man ja sowas machen:
Java:
    Beispiel(int health, String name) {
        super(health, name);
    }
Also den Konstruktor von der abstract Klasse aufrufen.
Wenn ich jetzt den Namen aber z.B. konstant in einer Klassen halten möchte, z.B. in einer Klasse Zombie sollen alle Objekte den namen Zombie haben. Wie realisere ich das? Wenn ich jetzt einen neuen Konstruktor schreibe, dann muss ich den Konstruktor aus der abstract Klasse verwenden. Aber der macht mir das Problem. Also wie kann ich den Konstruktor an eine Klasse anpassen?

Und ein anderes Problem in diesem Programm wäre:
Ich habe in der abstract Klasse paar Methoden und auch einen Wert maxHealth, der von Klasse zu Klasse verschieden ist. Die Methoden aus der abstract Klasse arbeiten mit dem Wert, aber dieser Wert ist in jeder Klasse verschieden. Wie schaffe ich es das die abstract Klasse auf maxHealth zugreifen kann, damit sie die Methoden richtig ausführt?

Vielen Dank

Falls jemand meint den Konstruktor in der abstract Klasse weg lassen oder ähnliches. Das löst vielleicht das Problem, aber ich möchte gern die Aufgabe so lösen wie sie gestellt wurde.
 

werdas34

Bekanntes Mitglied
In der abstract Klasse soll sich ein Konstruktor befinden, paar Methoden z.B. heal(), damage(), etc. Für ein Fantasy-Battle Simulation.
Denn soviel ich weiß, kann man von einer abstract Klasse kein Objekt instanzieren.
Und die erste Klasse, wo das erstere Problem auftritt, ist eine Zombie Klasse, wo alle Zombie Objekte Zombie heißen sollen. In anderen Klassen ist der Name frei wählbar solange er nicht leer ist.
Das zweitere Problem ist, dass diese Kreaturen ein maxHealth haben und wenn sie sich heilen, dann soll das maxHealth nicht überschritten werden.
z.B. Zombie hat maxHealth von 10, momentan Leben 8, durch heal() würde er auf 12 kommen, dann darf er trotzdem nur ein momentanes Leben von 10 haben, wegen maxHealth
 

werdas34

Bekanntes Mitglied
Mir fällt nun auf, dass die Klassen die eigene heal()/damage() Methoden haben, das Ergebnis nicht richtig übergeben.
Die heal() Methode aus der abstract Klasse funktioniert. Wird dieselbe Methode (also der Code von abstract kopiert und in z.B. in Zombie eingefügt), dann kommt als Ergebnis immer das was im Konstruktor steht.
Also der Code wird richtig überschrieben, (die Zwischenergebnisse stimmen auch) aber das Ergebnis getHealth ist immer der Wert vom Konstruktor.
getHealth ist in der abstract Klasse implementiert.
 

mrBrown

Super-Moderator
Mitarbeiter
Das liegt hier dran:
(Den Code, der die nötigen Informationen enthält, hab ich genauso wie du mal weggelassen)

SCNR
 

werdas34

Bekanntes Mitglied
abstract Klasse:
Java:
/*
* TODOs
* maxHealth anpassen
*
*/


public abstract class Creature {
    private int amountHealth;
    private String name;
    private int maxHealth = 5; //nur damit man testen kann
    //Konstruktor
    Creature(int health, String name){
        if(health < 0){
            throw new RuntimeException("Lebenspunkte dürfen nicht negativ sein");
        }else if(health > maxHealth) {
            throw new RuntimeException("Max Lebenspunkte überschritten");
        }
      
        amountHealth = health;
        this.name = name;
    }
  
    //Getter
    public int getHealth() {
        return this.amountHealth;
    }
    public boolean isAlive() {
        if(amountHealth == 0) {
            return false;
        }else {
            return true;
        }
    }
    public String getName() {
        return this.name;
    }
  
    //Methoden
    public Creature heal() {      
        if(amountHealth +1 > maxHealth) {
            amountHealth = maxHealth;
        }else {
            amountHealth++;
        }
        return this;
    }
    public Creature damage() {
        if(isAlive()) {
            amountHealth--;
        }
        return this;
    }
    public Creature attack (Creature victim) {
        if(victim != this && victim.isAlive()) {
            victim.damage();
        }
        return victim;
    }
}


Beispielhafte Klasse dessens Methode nicht ganz funktioniert.
Code:
/*
 * TODOs
 * damage method dont works getHealth ?
 *
 */


public class Robot extends Creature{
  
   private int maxHealth = 6;
   private int id = 0;
   private int damageCounter = 0;
   private int amountHealth = getHealth();
  
  
   Robot(int health, String name, int id) {
       super(health, "Robot"+id);
       this.id = id;
   }
  
   public Robot damage() {
       if(isAlive() && damageCounter > 4) {
       amountHealth = 0;
       }
       damageCounter++;
       return this;
   }

}
Der Robot soll 5 Angriffe problemlos überleben(damageCounter) und beim 6. Angriff sofort null Leben haben.

Ich denke es liegt an getHealth, da er den Wert des Konstruktors übernimmt, aber dann das was die Methode tun sollte(hier damage()) zwar durchgeht und umsetzt, aber den getHealth Wert ausprintet.
Weiteres Problem ist maxHealth wie man an den TODOs ablesen kann. Momentan auf 5 damit ich überhaupt testen kann, aber eigentlich hätte Robot ein maxHealth von 6 und andere Kreaturen ein anderes maxhealth.

Aufgrufen wird so:
Code:
public class FantasyBattle {

    public static void main(String[] args) {
        Robot test = new Robot(1, "", 123);
        test.damage();
        test.damage();
        test.damage();
        test.damage();
        test.damage();
        test.damage();
        test.damage();

        System.out.println(test.getHealth()); //Ergebnis 1, obwohl 0 erwartet wird.
  
    }

}
 

mrBrown

Super-Moderator
Mitarbeiter
In deiner Unterklasse hast du keinen Zugriff auf die Variablen der Oberklasse (da sie private sind) und kannst diese auch nicht überschreiben. Das amountHealth in Robot hat also nichts mit amountHealth von Creature zu tun.

Mit dem aktuellen Design ist das gewünschte Verhalten nicht so möglich - ist die abstrakte Klasse so vorgegeben, oder kannst du die ändern?


Soll maxHealth und amountHealth zu Beginn denn unterschiedlich sein?
 

werdas34

Bekanntes Mitglied
Vorgegeben ist, dass alle Objektvariabeln private sind, ein Konstruktor vorhanden ist (der Name und Leben entgegennimmt) und die Methoden isAlive() Heal() usw. , und die drei Getter. Dazu dürfen auch nur die oben verwendeten Methoden public sein. Weitere Methoden müssen private sein. Wie das für überschriebene Funktionen gelten soll, steht nicht da, aber ich gehe davon aus das nur die Methoden private sein müssen, die was komplett neues machen. Dazu keine statischen Variabeln/Methoden.

Ich habe die Aufgabe nicht gemacht, aber ich denke anfangs soll bzw kann es gleich sein. Nur ich schätze wenn man ein angeschlagene Kreatur zurückzieht und später einsetzt, hat es ja nicht wieder maximales Leben. In der Aufgabe heißt es auch, ist die Lebensdauer negativ oder höher als die maximal mögliche Lebensdauer, wirf eine Exception. Von daher denke ich das man das so machen soll, wie ich es gemacht habe. Ob's sinnvoll ist, ist eine andere Frage.
 
Zuletzt bearbeitet:

Javinner

Top Contributor
@werdas34
Wäre ich an deiner Stelle, würde ich als Erstes ein Plan erstellen, welcher beinhaltet, wieviele Spielfiguren es gibt und wieviele Arten davon, als Beispiel Roboter, Sammelroboter, Schutzroboter usw. Dann hätte ich mir Gedanken darüber gemacht, was die jeweilige Klasse können muss und erst dann würde ich nicht von Allgemeinen zu Speziellen, sondern genau andersrum, mich von Speziellen zu Allgemeinen durcharbeiten. Auf diesem Wege, welcher, ganz nebenbei, im Buch "Objektorientierte Programmierung" von Rheinwerkverlag, auch wenn recht trocken, aber sehr gut beschrieben wird, machte ich die größten Fortschritte, wenn es darum ging, die Klassen zu strukturieren. So sieht man zum Schluss, welche Variablen und Operationen alle Klassen gemeinsam haben und worin sich diese auch unterscheiden.

Weiterhin:
Java:
public boolean isAlive() {
    if(amountHealth == 0) {
        return false;
    }else {
        return true;
    }
}
würde ich so umsetzen:
Java:
public boolean isAlive()
{
    return amountHealth > 0;
}
}
Ebenso hätte ich bei Operation attack() wohl eher auf parametrisierte primitive Variablen zurück gegriffen, so, dass jeweilige Klasse alles, was sich selbst anbetrifft, auch selbst intern regelt.
Java:
/** Ich kann kein tieferen Sinn in der Operation erkennen */
public Creature attack (Creature victim) {
    if(victim != this && victim.isAlive()) {
         victim.damage();
    }
        return victim;
}
Hier wäre ich sehr wahrscheinlich den Weg gegangen, dass, wenn den die Instanz der jeweiligen Klasse den Angriff nicht überstehen würde, diese dann auch stirbt, sprich, für den Carbage Collector frei gegeben wäre, so, dass es vom Spielfeld verschwindet.
 

werdas34

Bekanntes Mitglied
@werdas34
Wäre ich an deiner Stelle, würde ich als Erstes ein Plan erstellen, welcher beinhaltet, wieviele Spielfiguren es gibt und wieviele Arten davon, als Beispiel Roboter, Sammelroboter, Schutzroboter usw. Dann hätte ich mir Gedanken darüber gemacht, was die jeweilige Klasse können muss und erst dann würde ich nicht von Allgemeinen zu Speziellen, sondern genau andersrum, mich von Speziellen zu Allgemeinen durcharbeiten. Auf diesem Wege, welcher, ganz nebenbei, im Buch "Objektorientierte Programmierung" von Rheinwerkverlag, auch wenn recht trocken, aber sehr gut beschrieben wird, machte ich die größten Fortschritte, wenn es darum ging, die Klassen zu strukturieren. So sieht man zum Schluss, welche Variablen und Operationen alle Klassen gemeinsam haben und worin sich diese auch unterscheiden.
Ich habe mir das nicht ausgedacht. Dies ist eine Aufgabe und es ist alles vorgeben. Es gibt 6 verschiedene Kreaturen, die alle drei Dinge tun können. heal(), damage() und attack(). Nur eine Kreatur heilt sich mehr und eine andere verhählt sich bei damage anders. Deshalb in der abstract Klasse, die drei Grundzüge der Methoden, und jede Kreature, die was besonderes verlangt, bekommt eine weitere Methode, die die eigentliche Methode überschreibt. z.B statt das damage 1 Schaden macht, macht es bei einer Kreatur 3 Schaden.

Weiterhin:
Java:
public boolean isAlive() {
    if(amountHealth == 0) {
        return false;
    }else {
        return true;
    }
}
würde ich so umsetzen:
Java:
public boolean isAlive()
{
    return amountHealth > 0;
}
}
Stimmt, da wäre effizienter. Danke.

Ebenso hätte ich bei Operation attack() wohl eher auf parametrisierte primitive Variablen zurück gegriffen, so, dass jeweilige Klasse alles, was sich selbst anbetrifft, auch selbst intern regelt.
Java:
/** Ich kann kein tieferen Sinn in der Operation erkennen */
public Creature attack (Creature victim) {
    if(victim != this && victim.isAlive()) {
         victim.damage();
    }
        return victim;
}
Hier wäre ich sehr wahrscheinlich den Weg gegangen, dass, wenn den die Instanz der jeweiligen Klasse den Angriff nicht überstehen würde, diese dann auch stirbt, sprich, für den Carbage Collector frei gegeben wäre, so, dass es vom Spielfeld verschwindet.

Auszug aus der Aufgabe:
Creature attack(Creature victim)
Diese Kreatur greift eine andere an und fügt dem Opfer dabei Schaden zu (Aufruf
von damage). Eine Kreatur greift sich niemals selbst an, der attack-Aufruf ist dann
wirkungslos. Das gilt auch für tote Kreaturen, die nicht mehr angreifen können.
Wenn das Opfer nicht existiert (null), wirft die Methode eine RuntimeException
(Anweisung throw new RuntimeException("reason")).

Ich glaube, aber dazu habe ich noch nicht genügend Kenntnisse zu Java. Aber ein Opfer kann nur dann nicht existieren, wenn es kein Leben hat, deswegen gehe ich davon aus das man da mit dem Carbage Collector arbeiten soll. Heißt somit auch ich muss noch eine weitere Exception werfen.
Da bekomme ich dann aber Probleme, da ich eine Kreatur Zombie erstellen muss, die nicht lebt, keine 0 Lebenspunkte hat und keinen Namen hat (null) (weiß auch nicht genau wie ich das konkret umsetzen soll). Sie können angreifen, obwohl sie tot sind.

Ich habe mir bei der attack Aufgabe folgendes überlegt:
victim != this => Kreature greift sich nicht selbst an.
&& victim.isAlive() => Kreatur muss leben. (Könnte man wahrscheinlich weglassen, wenn man mit CC arbeitet).
Da nur an victim was geändert wird, soll er zurückgeliefert werden.
 

Javinner

Top Contributor
@werdas34
Java:
public class CreatureBattle
{

    public static void main(String[] args)
    {
        ButterFly butterFly = new ButterFly();
        LadyBug ladyBug = new LadyBug();
     
        butterFly.attack(ladyBug);
        ladyBug = null;
        butterFly.attack(ladyBug);
        butterFly.attack(butterFly);
    }

}
/** Konsole */
Butterfly has attaked Ladybug
Apr 07, 2018 4:40:40 PM creaturebattle.ButterFly attack
INFORMATION: null
creaturebattle.VictimNotExist: Victim not exist
    at creaturebattle.ButterFly.attack(ButterFly.java:31)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:13)
Apr 07, 2018 4:40:40 PM creaturebattle.ButterFly attack
INFORMATION: null
creaturebattle.AttackNotAllowed: Attack not allowed: dont injure you self
    at creaturebattle.ButterFly.attack(ButterFly.java:40)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:14)
Java:
@Override
    void attack(Creature victim)
    {
        if (victim == null) {
            try {
                throw new VictimNotExist("Victim not exist");
            } catch (VictimNotExist ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
            }

        }

        if (this.equals(victim)) {
            try {
                throw new AttackNotAllowed("Attack not allowed: dont injure you self");
            } catch (AttackNotAllowed ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
            }
        }

        /**
         * Dein Code hier:
         *
         * Was soll nun passieren?
         * - wenn die Attacke zum Tod des Gegners fuehren wuerde?
         * - welche Abfragen sollte man an dieser Stelle tun,
         * weil es ja durchaus unterschiedliches Verhalten der Kontrahenten
         * gibt.
         */
/* nur zu Testzwecken */
        System.out.println(this.getName().concat(" has attaked ").concat(victim.getName()));
    }
 

Javinner

Top Contributor
@werdas34
Wobei ich gerade eine weitere Vorgehensweise für mich entdeckt habe:
Java:
 @Override
    void attack(Creature victim)
    {
        if (victim == null) {
            try {
                throw new VictimNotExist();
            } catch (VictimNotExist ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, ex.toString(), ex);
            }

        }

        if (this.equals(victim)) {
            try {
                throw new AttackNotAllowed();
            } catch (AttackNotAllowed ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, ex.toString(), ex);
            }
        }
        //Dein Code hier
    }
/** Konsole */
Apr 07, 2018 4:44:12 PM creaturebattle.ButterFly attack
INFORMATION: creaturebattle.VictimNotExist: Victim not exist
creaturebattle.VictimNotExist: Victim not exist
    at creaturebattle.ButterFly.attack(ButterFly.java:31)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:13)

Apr 07, 2018 4:44:12 PM creaturebattle.ButterFly attack
INFORMATION: creaturebattle.AttackNotAllowed: Attack not allowed: dont injure you self
creaturebattle.AttackNotAllowed: Attack not allowed: dont injure you self
    at creaturebattle.ButterFly.attack(ButterFly.java:40)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:14)
Java:
public class AttackNotAllowed extends Exception
{
    final static String ATTACK_NOT_ALLOWED = "Attack not allowed: dont injure you self";

    public AttackNotAllowed()
    {
        super(ATTACK_NOT_ALLOWED);
    }
}
Java:
public class VictimNotExist extends Exception
{
    final static String VICTIM_NOT_EXIST = "Victim not exist";
    public VictimNotExist()
    {
        super(VICTIM_NOT_EXIST);
    }
}
 

temi

Top Contributor
Java:
        if (victim == null) {
            try {
                throw new VictimNotExist("Victim not exist");
            } catch (VictimNotExist ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
            }

        }
Das ist ein etwas eigenwilliger Einsatz von try..catch.

Normalerweise kommt in den Try-Abschnitt etwas, das im Fehlerfall eine Exception werfen könnte und im Catch-Abschnitt wird entsprechend darauf reagiert.
Will man selbst eine Exception werfen, dann ist das kontraproduktiv => du wirfst eine Exception und unterdrückst sie anschließend. Wozu dann überhaupt die Exception?
 

werdas34

Bekanntes Mitglied
@werdas34
Java:
public class CreatureBattle
{

    public static void main(String[] args)
    {
        ButterFly butterFly = new ButterFly();
        LadyBug ladyBug = new LadyBug();
   
        butterFly.attack(ladyBug);
        ladyBug = null;
        butterFly.attack(ladyBug);
        butterFly.attack(butterFly);
    }

}
/** Konsole */
Butterfly has attaked Ladybug
Apr 07, 2018 4:40:40 PM creaturebattle.ButterFly attack
INFORMATION: null
creaturebattle.VictimNotExist: Victim not exist
    at creaturebattle.ButterFly.attack(ButterFly.java:31)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:13)
Apr 07, 2018 4:40:40 PM creaturebattle.ButterFly attack
INFORMATION: null
creaturebattle.AttackNotAllowed: Attack not allowed: dont injure you self
    at creaturebattle.ButterFly.attack(ButterFly.java:40)
    at creaturebattle.CreatureBattle.main(CreatureBattle.java:14)
Aber da müsste ich ja in der main selber sagen, das die Kreatur null ist. Lässt sich doch sicher irgendwie mit amountHealth == 0 und dann butterFly = null; lösen, oder?


Java:
@Override
    void attack(Creature victim)
    {
        if (victim == null) {
            try {
                throw new VictimNotExist("Victim not exist");
            } catch (VictimNotExist ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
            }

        }

        if (this.equals(victim)) {
            try {
                throw new AttackNotAllowed("Attack not allowed: dont injure you self");
            } catch (AttackNotAllowed ex) {
                Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
            }
        }

        /**
         * Dein Code hier:
         *
         * Was soll nun passieren?
         * - wenn die Attacke zum Tod des Gegners fuehren wuerde?
         * - welche Abfragen sollte man an dieser Stelle tun,
         * weil es ja durchaus unterschiedliches Verhalten der Kontrahenten
         * gibt.
         */
/* nur zu Testzwecken */
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(this.getName().concat(" has attaked ").concat(victim.getName()));
    }
Ich habe vergessen, das man in Java Objekte mit .equals() vergleicht.
Java:
Logger.getLogger(ButterFly.class.getName()).log(Level.INFO, null, ex);
Ist das wichtig? Könnte ich nicht einfach eine simple System.out.println Ausgabe machen?

Danke für die Tipps. Aber wie man mit Exceptions umgeht weiß ich. Zumindest habe ich es schon paar Mal erfolgreich angewandt.
Aber mein eigentliches Problem ist ja, dass ich in der abstract Klasse einen Wert habe maxHealtth und diesen alleine schon im Konstrukor benötige. Dieser Wert ist aber von jeder Kreatur verschieden.
Dazu habe ich das Problem, dass wenn man z.B. den Robot ausführt, er egal was man macht immer das Leben besitzt das im Konstruktor festgelegt wurde.
Oder ist es schlicht nicht möglich wenn die Variabeln auf private sind?
 

Javinner

Top Contributor
Ist das wichtig? Könnte ich nicht einfach eine simple System.out.println Ausgabe machen?
Der Log war nur zum Veranschaulichen gedacht.
Aber mein eigentliches Problem ist ja, dass ich in der abstract Klasse einen Wert habe maxHealtth und diesen alleine schon im Konstrukor benötige. Dieser Wert ist aber von jeder Kreatur verschieden.
Schau dir den Post #3 noch mal an.
Ebenso mein Senf dazu:
Java:
public class CreatureBattle
{

    public static void main(String[] args)
    {
     
        ButterFly butterFly = new ButterFly();
        System.out.println(butterFly.toString());
        System.out.println(butterFly.getMaximalHealth());
    }

}
/** Konsolenausgabe */
Butterfly
1000
Java:
abstract class Creature
{

    private final String name;
    private int max_health;

    Creature(String name, int health)
    {
        this.name = name;
        this.max_health = health;
    }

    protected String getName()
    {
        return name;
    }

    protected int getMaximalHealth()
    {
        return max_health;
    }

 
    abstract void attack(Creature creature);

    abstract void health(int health);

    abstract void damage(int damage);

}
Java:
public class ButterFly extends Creature
{

    final static String BUTTERFLY_NAME = "Butterfly";
    final static int MAX_HEALTH = 1000;

    public ButterFly()
    {
        super(BUTTERFLY_NAME, MAX_HEALTH);
    }

    @Override
    protected String getName()
    {
        return super.getName(); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    protected int getMaximalHealth()
    {
        return super.getMaximalHealth(); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    void attack(Creature creature)
    {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    void health(int health)
    {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    void damage(int damage)
    {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
  
    @Override
    public String toString()
    {
        return getName();
    }

}
Eigene Klassen erstellen: JIAEI

Edit: eine Klasse kann mehrere Konstruktoren haben.
Wenn du ein Sinn erkennst, ein anderen Konstruktor zu erschaffen, warum auch immer, nur zu. Wichtig ist, es muss ein Sinn haben. Der Sinn hängt sehr stark von gegebenen Anforderungen ab. Da wirst du dir Gedanken machen müssen.
Ich lege dir wirklich ans Herz, dich in das verlinkte Buch einzulesen.
 

mrBrown

Super-Moderator
Mitarbeiter
Wäre ich an deiner Stelle, würde ich als Erstes ein Plan erstellen, welcher beinhaltet, wieviele Spielfiguren es gibt und wieviele Arten davon, als Beispiel Roboter, Sammelroboter, Schutzroboter usw. Dann hätte ich mir Gedanken darüber gemacht, was die jeweilige Klasse können muss und erst dann würde ich nicht von Allgemeinen zu Speziellen, sondern genau andersrum, mich von Speziellen zu Allgemeinen durcharbeiten. Auf diesem Wege, welcher, ganz nebenbei, im Buch "Objektorientierte Programmierung" von Rheinwerkverlag, auch wenn recht trocken, aber sehr gut beschrieben wird, machte ich die größten Fortschritte, wenn es darum ging, die Klassen zu strukturieren. So sieht man zum Schluss, welche Variablen und Operationen alle Klassen gemeinsam haben und worin sich diese auch unterscheiden.
Wie steht das den da so beschrieben, hast du 'n Kapitel?
Erst Unterklassen designen und dann die Gemeinsamkeiten in einer Oberklasse zusammenfassen führt häufig zu Problemen...

Hier wäre ich sehr wahrscheinlich den Weg gegangen, dass, wenn den die Instanz der jeweiligen Klasse den Angriff nicht überstehen würde, diese dann auch stirbt, sprich, für den Carbage Collector frei gegeben wäre, so, dass es vom Spielfeld verschwindet.
Die Klasse hat keine Controller darüber, wann sie vom Garbage-Collector aufgeräumt werden kann. Vor allem kann sie erst durch den Garbage-Collector aufgeräumt werden, wenn keiner sie mehr kennt. Das freigeben kann also keineswegs zu einem Verschwinden vom Spielfeld führen.

Aber mein eigentliches Problem ist ja, dass ich in der abstract Klasse einen Wert habe maxHealtth und diesen alleine schon im Konstrukor benötige. Dieser Wert ist aber von jeder Kreatur verschieden.
Dazu habe ich das Problem, dass wenn man z.B. den Robot ausführt, er egal was man macht immer das Leben besitzt das im Konstruktor festgelegt wurde.
Oder ist es schlicht nicht möglich wenn die Variabeln auf private sind?
Deine Oberklasse muss für diesen Fall entsprechende Methoden anbieten.

In deinem genannten Fall seh ich aber z.B. nicht, wofür du dies brauchst. Das kannst du einfach durch passendes überschreiben lösen.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
public class ButterFly extends Creature
{
    //...
    @Override
    protected String getName()
    {
        return super.getName(); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    protected int getMaximalHealth()
    {
        return super.getMaximalHealth(); //To change body of generated methods, choose Tools | Templates.
    }
    ///..
}
Sowas ist allerdings in dem Fall ziemlich sinnlos ;)
 

Javinner

Top Contributor
mrBrown hat gesagt.:
bringt in dem Fall einfach nichts...
Auch wenn ich die Zeile aus dem Kontext reise, so passt es doch zu meiner bereits gefestigten Meinung über dich :)
Du hast Java, bzw. Programmieren bestimmt richtig gut drauf, dein Mittarbeiter-Schriftzug bestätigt es noch ein weiteres Mal, Gratulation an dieser Stelle. Jedoch, wie so oft sind deine Posts zumindest für mich keine wirkliche Hilfe.
Du kommst, erklärst alles für unzureichend und verschwindest wieder, ohne ein Gefühl zu hinterlassen, wirklich geholfen zu haben. Da greife ich doch nächstes Mal gleich zum Buch und Netz, mit der Gefahr, etwas so zu programmieren, um es später eventuell ändern zu müssen. Jedoch bringt mich es weiter, als mich von dir belehren zu lassen.

Ich will aber hier und überhaupt kein Fass aufmachen, weil es mich letztendlich nicht betrifft, daher schönen Abend.
 

mrBrown

Super-Moderator
Mitarbeiter
Auch wenn ich die Zeile aus dem Kontext reise, so passt es doch zu meiner bereits gefestigten Meinung über dich :)
Du hast Java, bzw. Programmieren bestimmt richtig gut drauf [...]. Jedoch, wie so oft sind deine Posts zumindest für mich keine wirkliche Hilfe.
Du kommst, erklärst alles für unzureichend und verschwindest wieder, ohne ein Gefühl zu hinterlassen, wirklich geholfen zu haben. Da greife ich doch nächstes Mal gleich zum Buch und Netz, mit der Gefahr, etwas so zu programmieren, um es später eventuell ändern zu müssen. Jedoch bringt mich es weiter, als mich von dir belehren zu lassen.

Naja, soll ich jetzt näher erklären, warum das Überschreiben einer methode und dann nur aufrufen der überschriebenen Methode sinnlos ist? o_O
Das verhalten ist *genau das selbe*, wenn die Methode an der Stelle nicht überschrieben wird.
Mir war jetzt nicht bewusst, dass das nähere Erklärung braucht, sonst hätte ich die gerne dazu geschrieben...

Bei Fragen bin ich auch gern dazu bereit, alles bis ins kleinste Detail zu erklären...
 

Meniskusschaden

Top Contributor
@Javinner: Ich kann deine Kritik nicht nachvollziehen. Es ist doch eine große Hilfe, zu erfahren, dass etwas nicht richtig oder nicht sinnvoll ist. Oft erkennt man es danach selbst und andernfalls kann man noch mal nachfragen. Ich kann mich nicht erinnern, dass @mrBrown dann schon mal die Begründung für seine Sichtweise schuldig geblieben wäre.
Ehrlich gesagt verstehe ich auch nicht, dass ausgerechnet du dich so äußerst, denn es scheint ja Teil deiner Java-Lernstrategie zu sein, das Forum nicht so sehr für eigene Fragen zu nutzen, sondern zu versuchen, selbst Fragen zu beantworten, was ich übrigens für einen ziemlich guten Weg halte. Da riskiert man natürlich, auch mal falsch zu liegen und könnte deshalb eigentlich ganz besonders von solchen Hinweisen profitieren.
 

Javinner

Top Contributor
Meniskusschaden hat gesagt.:
Es ist doch eine große Hilfe, zu erfahren, dass etwas nicht richtig oder nicht sinnvoll ist
Absolut! @mrBrown hat es schon drauf und ich gestehe, dass ich ihm in Sachen Programmieren nicht das Wasser reichen kann. Für jemand, der sich mit der Materie auskennt, ist er sicherlich eine Hilfe, dabei denke ich an die Point-Diskussion. Für mich, und das liegt sicherlich auch ein Stück an mir, ist seine Art nicht immer eine Hilfe. Mein größter Kritikpunkt ist die fehlende Unterstreichung seiner Worte durch den Code, bzw. Aussagen, welche den Teil mit "weil" auslassen. Als Beispiel der Post #19
Erst Unterklassen designen und dann die Gemeinsamkeiten in einer Oberklasse zusammenfassen führt häufig zu Problemen...
, weil? Und manchmal werde ich das Gefühl nicht los, dass er gern ums Recht diskutiert, das ist jedoch nur meine persönliche Einschätzung. Es ist gut möglich, dass ich es allein so sehe.

denn es scheint ja Teil deiner Java-Lernstrategie zu sein, das Forum nicht so sehr für eigene Fragen zu nutzen, sondern zu versuchen, selbst Fragen zu beantworten
Ich bin in der Hinsicht wie Ullenboom, ich lese ein Buch und schreibe mir auf, was ich nicht verstehe. Das sind dann die Punkte, an den ich arbeite. Durch den Forum kommt man zur Übung, weil offen gestanden, mir oft die Ideen fehlen, was ich mit dem erlangten Wissen alles anstellen kann. Dabei versuche ich die Punkte auszugleichen, die ich beim Lesen eines Buches hier und da vermisst habe, durch die Idee, nichts weiter sind meine Posts, Idee, welche einem Anfänger am anderen Ende gerade fehlt. Und wenn ich sehe, dass da Interesse und Fleiß dahinter stecken, dann bin ich freilich gewillt zu helfen, mit bestem Wissen und Gewissen.

Was das Programmieren angeht, las ich an einigen Stellen, dass es DEN WEG einfach nicht gibt. Aus dem Grund entwickeln sich Sprachen weiter, neue werden geboren usw., und das in einem Wahnsinns-Tempo! Da kommt man als Hobby-Programmierer a) nicht mit und b) nicht alles, was kommt, auch als sinnvoll und leicht zu erlernen erscheint (Lambdas wäre so ein Thema). Daher kann es schon unterschiedliche Meinungen seitens Hobby- und Berufsprogrammierer geben. Ich schaue gerade auf die Uhr und stelle fest, ich geh jetzt ins Bett.
Gute Nacht.
 

fristo

Mitglied
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Mein größter Kritikpunkt ist die fehlende Unterstreichung seiner Worte durch den Code, bzw. Aussagen, welche den Teil mit "weil" auslassen
Begründungen liefer ich gern immer nach. Code oft ungern, das sind meistens zu abstrakte Aussagen, um die irgendwie "gut" durch Code unterstreichen zu können oder es wäre die direkte Antwort auf die gestellte Frage, womit man jede Eigeninitiative direkt verhindert - wenn gewollt kann ich das aber auch gerne zu dem meisten liefern.

Erst Unterklassen designen und dann die Gemeinsamkeiten in einer Oberklasse zusammenfassen führt häufig zu Problemen...
, weil? Und manchmal werde ich das Gefühl nicht los, dass er gern ums Recht diskutiert, das ist jedoch nur meine persönliche Einschätzung. Es ist gut möglich, dass ich es allein so sehe.

weil das dann häufig keine "ist ein" Beziehung zwischen Ober- und Unterklasse ist, welche aber eben Vererbung ausmachen sollte.
Wenn man nach Gemeinsamkeiten sucht, findet man immer welche: zB ein Fenster und ein Buch, beide haben Titel und Inhalt - also eine gemeinsame Oberkasse?
Aus der gleichen Richtung kommt auch das beliebte Vererben von JFrame, wenn man ein Fenster braucht - nur weil sie Gemeinsamkeiten haben, ist das kein Grund für Vererbung.

In diesem Fall wollte ich mich damit aber explizit auf das von dir angesprochene Buch beziehen, weil eine Begründung, die nichts mit dem Thema zu tun hat, nicht unbedingt sinnvoll wäre. In dem Fall hätte ich sogar eher auf ein "Stille Post"-Problem getippt, ich möchte nicht ausschließen, dass ich deine Wiedergabe davon falsch verstanden hab, und das eigentlich völlig richtig war - dann wäre es doch sinnfrei, dagegen zu argumentieren?

Daher kann es schon unterschiedliche Meinungen seitens Hobby- und Berufsprogrammierer geben.
Mich würden btw die wenigsten als "Berufsprogrammierer" bezeichnen ;)
 

mrBrown

Super-Moderator
Mitarbeiter
ändern in:

Java:
private int amountHealth = super.getHealth();




ändern in:
Java:
       if(isAlive() && ++damageCounter >= (maxHealth - 1)) {
       amountHealth = 0;
       }
       return this;
Nein! Weder würde das funktionieren (zB hat die Unterklasse keinen Zugriff auf zB maxHealth), noch wäre es sinnvolle (z.B. hätte die Klasse jetzt zwei Variablen [iocde]amountHealth[/icode], in der Ober und Unterklasse).


Ein möglicher Weg wäre, das der Roboter einen damageCount bekommt und zusätzlich einfach nur 1 als maxHealth und healthAmount.
damage() überschreibt man dann so, dass solange damageCount größer ist als 0 (er also noch schaden nehmen kann) einfach nur der damageCount verringert wird. Wenn damageCount 0 ist, wird er nicht weiter verringert, sonder super.damage() aufgerufen - das verringert dann korrekt healthAmount und der Roboter wäre tot.
(Das ganze geht jetzt davon aus, dass damageCount zu Anfang zB 5 wäre, wenn er 5 mal Schaden nehmen darf. Geht natürlich auch mit 0 als Start und bei Schaden zählt man hoch, dann muss man die Bedingung entsprechend ändern)
@werdas34, ist das ein Ansatz, der dir weiter hilft?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben