Java Anfängerfragen Java-Einstieg

I

It'sNever2Late!

Gast
Hi,

ich habe ein kleines Spiel geschrieben, was zwar keine Fehler auswirft aber dennoch nicht funktioniert.

Spiel:
http://nopaste.info/00a2e59d0c.html

Ich weiß, dass es sehr schwach programmiert wurde, ich habe beispielsweise 4 Methoden (_Game) erstellt obwohl es eine mit unterschiedlichen Parametern auch getan hätte.

Und die Main-Funktion hätte sicherlich auch viermal kürzer verfasst werden können.

Nur will ich erstmal wissen was ich falsch gemacht habe und warum es nicht nicht läuft.

Desweiteren habe ich ein paar Fragen die ich nicht so ganz verstehe:
Ich habe folgendes ich nem Java Lernbuch einer Uni gefunden:
PHP:
Person mutter;
Person vater;
mutter = new Person();
vater = new Beamter()
Allerdings können in diesem Fall auch für das Objekt vater nur die Datenfelder und Methoden
aufgerufen werden, die für Personen definiert sind, andernfalls erhält man einen Compiler-
Fehler.
Dies ist ja gerade der Zweck der Vererbung: Uns interessiert in diesem Programm nur,
dass es sich um Personen handelt, und es ist völlig egal, ob es ein Beamter mit Dienstklasse
oder ein Student mit Studienrichtungen oder ein Angestellter mit Arbeitgeber und Gehalt is
Was zur Hölle bringt dann Vererbung?
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

http://www.programmersbase.net/Content/Java/Content/Tutorial/Java/Heredity.htm
Ist keine Hexerei, lies das und dann frag wieder wenn was unklar ist, ka was du da für ein Buch gehabt hast, aber in deinem quote ist keine Vererbung drin denn das passiert wie soll ichs sagen, ÜBER dem was du da gepostet hast:D

Klassen definieren
class Person( String Name {
this.Name=Name;
system.out.println(Name);
}

class Beamter extends Person {

};

Variablen erzeugen
Person utter;
Beamter vater;

den variablen was zuordnen

mutter = new Person();
vater= new Beamter();

Das ganz noch n bisl getter und setter und die eine oder andre Funktionalität für die leeren objekte und du kannst damit was anfangen, dafür musste du mal nachlesen was so alles vererbt werden kann und wie.
 
Zuletzt bearbeitet: (t)
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

EDIT:

ALSO:
public class Person {
public String name;
public Date geburtsDatum;
...
public void addCar()...
}
public class Beamter extends Person {
public int dienstKlasse;
public Date eintrittsDatum;
...
public void listThem()...
}

Zuordnung
Person mutter;
Person vater;
mutter = new Person();
vater = new Beamter();
vater und mutter sind jetzt vom typ Person.
mutter kann auf alle methoden der Klasse Person zugreifen. (mutter.addCar) z.b.
was kann der Vater nun? auf alle Methoden zugreifen (also vater.addCar und vater.listThem) z.B.

Oder kann vater erst auf die Methoden von Beamter zugreifen wenn er auch vom Typ Beamter ist?
Also
Beamter vater = new Beamter();
vater.listThem();
Nur das bringt doch NIX.
Dann kann man genausogut die Methode in Person reinschreiben.
Ich erkenne da nix von Vererbung btw. extends.

Ich kenne extends und implements von PHP aber da ist das etwas leicher...
 
Zuletzt bearbeitet:
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Was soll das Programm den machen?
Und für einen "Anfänger" hast du dir was ziemlich kompliziertes ausgesucht
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Ich will hier kein fertiges Programm von euch bei dem ich nix kapier.

Mir geht es nicht um das Programm sondern darum etwas zu lernen.

Das Programm soll 5 leichte, 5 normale, 5 schwere und 5 crazy Mathefragen stellen. (die methoden kann man natürlich verbessern es soll erstmal funktionieren)
Gibt man was falsch ein kommt looser und hat man alles richtig kommt you win.
ich weiß, dass das extrem erbärmlich programmiert wurde nur in PHP wäre so etwas 100x einfacher
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

extends und implements bedeutet:
Man braucht es wenn sich mehrere Abschnitte wiederholen und man es praktisch das gleiche aufschreiben müsste. Man kann jetzt in eine Methode diesen wiederholenden Teil reinschreiben und durch extends deutlich machen, dass dies praktisch die Basis zu anderen Methoden ist. Jetzt kannst du andere Methoden schreiben, die alle verschiedene Sachen machen, aber die gleiche "Basis" allein würden diese Methoden nicht funktionieren und müssen dann mit implements auf die Basis Methode verwiesen werden

Edit: Ich würde mal in Zeile 138 vorbeischauen, ich denkmal es müsste heißen while(i<5)
genauso in den anderen Schleifen auch, sonst wird es einmal durchgehen und dann aufhören weil i nicht GRÖßER als 5 ist wodurch dann auch die i=5 abfrage nicht funktioniert, weil i gerade mal 1 ist
 
Zuletzt bearbeitet:
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

@xxhagixx
Man braucht es wenn sich mehrere Abschnitte wiederholen und man es praktisch das gleiche aufschreiben müsste.
Verstehe ich, ist auch angebracht und absolut sinnvoll. Habe ich schon oft in PHP mit normalen Funktionen gemacht.
Nennen wir diese Methode (da sie mehrfach aufgerufen wird) mal nFunktion.
Man kann jetzt in eine Methode diesen wiederholenden Teil reinschreiben und durch extends deutlich machen, dass dies praktisch die Basis zu anderen Methoden ist.
Das bedeutet, dass Methoden die nFunktion aufrufen mit dem Rückgabewert (sofern es einen Gibt) arbeiten müssen.(noch sehe ich hier keine Rechtfertigung von extends/implements)
Siehe in meinem Programm die Methode randomNumber. Sie wird mehrfach aufgerufen und ist die Basis der anderen Methoden und es sollte auch ohne extends/implements funktionieren.

Jetzt kannst du andere Methoden schreiben, die alle verschiedene Sachen machen, aber die gleiche "Basis" allein würden diese Methoden nicht funktionieren und müssen dann mit implements auf die Basis Methode verwiesen werden
Verstehe ich nicht.
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

It'sNever2Late! schrieb:
Ich will hier kein fertiges Programm von euch bei dem ich nix kapier.

Mir geht es nicht um das Programm sondern darum etwas zu lernen.

Auch wenn es am Thema vorbei ist, will ich dich für diese Aussagen loben. Da hört man hier leider "sehr selten"-gar nicht.

Für die Sinnfrage bzgl. Vererbung:
http://de.wikipedia.org/wiki/Vererbung_(Programmierung)#Beispiel
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

moquai :D
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Moquai!

Hab´s jetzt die Tage bei euch wieder gesehen. War schon bei der ersten Aktion dabei, aber jetzt schon wieder? Naja...

Free moquai!
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Wir machen das mal anhand deines Mathespiels
du hast 4 Spiele: easy,normal,hard und crazy in diesen 4 Spielen passiert absolut das gleiche
bis auf die maximal Größe der Zufallszahl. Jetzt könntest du die 4 switch Anweisungen in zu einer einzigen machen, weil ja immer genau das gleiche passiert. Das steckst du in eine neue Methode welche du mit implements versiehts, da sie ja die Zufallswerte braucht. Diese Zufallswerte kannst du in den Methoden lassen und versiehst sie mit extends, damit die neue Methode auf die Methode zugreifen kann. Ohne die Vererbung würden die 5 Methoden keinen nutzen haben, aber durch die Vererbung sparst du dir ein paar Zeilen schreibarbeit
und der Computer muss weniger sinnlose Zeilen bearbeiten;)
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Jetzt könntest du die 4 switch Anweisungen in zu einer einzigen machen, weil ja immer genau das gleiche passiert
Ja, aber ich verstehe nicht wieso man das einfach nicht mit einer normalen Methode anstatt mit ner neuen Klasse mit implemets macht.

WO ist das der Sinn?

@xxhagixx
das hat nichts gebracht, ich bekomme folgendes:
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
at Mathespiel.<init>(Mathespiel.java:7)
In Zeile 7 steht:
Mathespiel methods = new Mathespiel();
Und methods._Game wird in den anderen public methoden aufgerufen.
 
Zuletzt bearbeitet:
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

It'sNever2Late! schrieb:
Was zur Hölle bringt dann Vererbung?

Das Schlüsselkonzept der Vererbung ist ist-ein(e). In diesem Fall bedeutet das: Jeder Beamter ist eine Person und kann überall dort, wo eine Person erwartet wird, eingesetzt werden.

Konkrete Vorteile der Vererbung sind z. B.:

  • Du brauchst Methoden und Datenfelder, die "Person" und "Beamter" gemeinsam haben, nur einmal zu definieren, nämlich in "Person". Jeder Beamte bekommt diese dann durch die Vererbung automatisch.
  • Du kannst Methoden, die eine Person als Argument erwarten, auch einen Beamten übergeben (weil ein Beamter eine Person ist, s.o.).
  • Du kannst Beamte in eine Liste von Personen einfügen (dito).

Das nur spontan aus dem Kopf, es gibt durchaus noch mehr :)
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Dann nochmal für mich, den PHPler:
Du brauchst Methoden und Datenfelder, die "Person" und "Beamter" gemeinsam haben, nur einmal zu definieren, nämlich in "Person". Jeder Beamte bekommt diese dann durch die Vererbung automatisch.
Also so?
PHP:
import java.util.Scanner;
public class Person {
	Scanner input = new Scanner(System.in);
  Person method = new Person();
  
  public void saySomething(){
    System.out.println("Ich putze hier nur.");
  }
  
}

class Beamter extends Person{
  
	public static void main (String args[]) {
  Beamter lehrer = new Beamter();
  lehrer.saySomething();
  String a = input.nextLine();
		
	}
}
Oder kommt die void main in die class Person?

Du kannst Methoden, die eine Person als Argument erwarten, auch einen Beamten übergeben (weil ein Beamter eine Person ist, s.o.).
Mir Argument meinst du einen simplen Parameter?
Also so?
PHP:
import java.util.Scanner;
public class Person {
	Scanner input = new Scanner(System.in);
  Person method = new Person();
  
  public void saySomething(){
    System.out.println("Ich putze hier nur.");
  }
  
  public void sayThis(String word){
    System.out.println(word);
  }
  
}

class Beamter extends Person{
  
	public static void main (String args[]) {
  Beamter lehrer = new Beamter();
  lehrer.saySomething();
  String a = input.nextLine();
  
  lehrer.sayThis(a);
	}
}
Ich bekomme hier übrigens Fehler beim Kompilieren und will den Fehler nicht einfach beseitigen sondern wissen was ich genau falsch gemacht habe.
Du kannst Beamte in eine Liste von Personen einfügen (dito).
Weiß nicht was du damit meinst.
 
Zuletzt bearbeitet:
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

It'sNever2Late! schrieb:
Ich habe folgendes ich nem Java Lernbuch einer Uni gefunden:

Allerdings können in diesem Fall auch für das Objekt vater nur die Datenfelder und Methoden aufgerufen werden, die für Personen definiert sind, andernfalls erhält man einen Compiler-
Fehler.

PHP:
Person mutter;
Person vater;
mutter = new Person();
vater = new Beamter()

Was zur Hölle bringt dann Vererbung?

Üblicherweise eine klare Strukturierung, die Wiederverwendung von Code und dadurch eine bessere Wartbarkeit.

Das Zitat aus dem Lehrbuch besagt nichts anders, als dass Du im Codebeispiel bei der vater-Variable lediglich auf die Daten und Methoden, die in der Klasse (oder dem Interface) Person definiert sind, zugreifen kannst. Dies deswegen, weil als Typ lediglich die Basis-Klasse (Person) zugewiesen wird.

Das muss man natürlich nicht so machen. Du könntest auch schreiben:

PHP:
Person mutter = new Person();
Beamter vater = new Beamter()

Wenn man auf die Eigenschaften und Methoden in Beamter zugreifen wollte, würde man diese Variante wählen. Wobei es auch möglich wäre, von Person auf Beamter down zu casten (wobei man dann natürlich wissen muss, dass dies eine Instanz des Typs Beamter ist).
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

Wenn man auf die Eigenschaften und Methoden in Beamter zugreifen wollte, würde man diese Variante wählen. Wobei es auch möglich wäre, von Person auf Beamter down zu casten (wobei man dann natürlich wissen muss, dass dies eine Instanz des Typs Beamter ist).
sfresse.gif


Das Zitat aus dem Lehrbuch besagt nichts anders, als dass Du im Codebeispiel bei der vater-Variable lediglich auf die Daten und Methoden, die in der Klasse (oder dem Interface) Person definiert sind, zugreifen kannst. Dies deswegen, weil als Typ lediglich die Basis-Klasse (Person) zugewiesen wird.
Also stimmt mein Codeschnippsel von oben?
Hier nochmal:
http://nopaste.info/b5ff73e830.html

Aber es muss doch sicher einen Unterschied zwischen:
PHP:
Person mutter = new Person();
Person vater = new Beamter();
und
PHP:
Person mutter = new Person();
Beamter vater = new Beamter();
geben.

Den würde ich auch nur zu gerne kennen.

Kann ich in der extends Class Beamter auch folgendes deklarieren?
PHP:
class Beamter extends Person{
Person mutter = new Person();
}
Oder kann ich nur Beamter xx = new Beamter(); deklarieren?

Nochmal:
PHP:
Person mutter;
Person vater;
mutter = new Person();
vater = new Beamter();
Allerdings können in diesem Fall auch für das Objekt vater nur die Datenfelder und Methoden
aufgerufen werden, die für Personen definiert sind, andernfalls erhält man einen Compiler-
Fehler.
Im Lernbuch steht, dass vater die Methoden von Person nicht verwenden kann während ihr mir sagt (zumindest verstehe ich das so), dass vater die Methoden von Beamter und Person aufrufen kann.?
 
AW: Fehlerfreies aber funktionsunfähiges Anfängerprogramm + Anfängerfragen

It'sNever2Late! schrieb:
Dann nochmal für mich, den PHPler:

Also so?
PHP:
import java.util.Scanner;
public class Person {
	Scanner input = new Scanner(System.in);
  Person method = new Person();
  
  public void saySomething(){
    System.out.println("Ich putze hier nur.");
  }
  
}

class Beamter extends Person{
  
	public static void main (String args[]) {
  Beamter lehrer = new Beamter();
  lehrer.saySomething();
  String a = input.nextLine();
		
	}
}
Oder kommt die void main in die class Person?

Das lässt sich nicht verbindlich sagen. Kommt auf das Problem an. Üblicherweise verwendet man eher so etwas (jede Klasse in einer eigenen Datei):

Code:
class Person {
    private int age;

    public void saySomething() {
        System.out.println("Ich putze hier nur.");
    }
}

class Beamter extends Person {
    private Object id;

    public void checkTaxDeclaration() {
    }
}

class Program {
    public static void main(final String[] args) {
        Beamter lehrer = new Beamter();
        lehrer.saySomething();

        Scanner input = new Scanner(System.in);
        String a = input.nextLine();
    }
}




It'sNever2Late! schrieb:
Mir Argument meinst du einen simplen Parameter?
Also so?
PHP:
import java.util.Scanner;
public class Person {
	Scanner input = new Scanner(System.in);
  Person method = new Person();
  
  public void saySomething(){
    System.out.println("Ich putze hier nur.");
  }
  
  public void sayThis(String word){
    System.out.println(word);
  }
  
}

class Beamter extends Person{
  
	public static void main (String args[]) {
  Beamter lehrer = new Beamter();
  lehrer.saySomething();
  String a = input.nextLine();
  
  lehrer.sayThis(a);
	}
}
Ich bekomme hier übrigens Fehler beim Kompilieren und will den Fehler nicht einfach beseitigen sondern wissen was ich genau falsch gemacht habe.

input ist eine Eigenschaft der Klasse Person. Deswegen kannst Du nur bei einer Instanz der Klasse darauf zugreifen. Du müsstet im Beispiel

Code:
String a = lehrer.input.nextLine();
verwenden (was nur geht, wenn die Klassen Lehrer und Person sich im gleichen Ordner befinden).

Aber der Scanner gehört sicher nicht dorthin (s.o.)
 
Für mich ist input ein Object vom Typ Scanner innerhalb der Klasse Person.

Ich habe jetzt noch was ausprobiert und folgendes:
Datei 1:
PHP:
import java.util.Scanner;
class Program {
  public static void main(final String[] args) {
    Scanner input = new Scanner(System.in);
    Person mutter = new Person();
    Beamter vater = new Beamter();
    Person sohn = new Beamter(); /*WTF*/

    System.out.print("Name der Mutter: ");
    String m = input.nextLine();
    mutter.saySomething();

    System.out.print("Name des Vaters: ");
    String v = input.nextLine();
    vater.saySomething();
    vater.sayThis(v);

    System.out.print("Name des Sohns: ");
    String s = input.nextLine();
    sohn.saySomething();
    //sohn.sayThis(s);
    // Wird dieser Code ausgeführt gibt es einen Compiler-Fehler...
  }
}

Datei 2:
PHP:
class Person {
  public void saySomething() {
    System.out.println("Ich putze hier nur.");
  }
}

Datei 3:
PHP:
class Beamter extends Person {
  public void sayThis(String word){
    System.out.println(word);
  }
}

Erkenntnis:
Das Object sohn vom Typ Person kann keine Methoden der Klasse Beamter aufrufen obwohl es (irgendwie?) auch noch als Beamter deklariert wurde.
 
It'sNever2Late! schrieb:
Also stimmt mein Codeschnippsel von oben?

Hinsichtlich der Vererbung von Person und Beamter ist das ok.

It'sNever2Late! schrieb:
Aber es muss doch sicher einen Unterschied zwischen:
PHP:
Person mutter = new Person();
Person vater = new Beamter();
und
PHP:
Person mutter = new Person();
Beamter vater = new Beamter();
geben.

Den würde ich auch nur zu gerne kennen.

Der Unterschied ist der unterschiedliche Zuweisungstyp. Einmal Person, einmal Beamter. Da Beamter vom Typ Person ist, ist das möglich.

Je nachdem welchen Typ die Variablen haben, kann man einmal nur auf die Methoden/Eigenschaften von Person, und einmal auf alle Methoden/Eigenschaften von Person und Beamter zugreifen.


It'sNever2Late! schrieb:
Kann ich in der extends Class Beamter auch folgendes deklarieren?
PHP:
class Beamter extends Person{
Person mutter = new Person();
}

Klar geht das. mutter ist dann eine Eigenschaft von Beamter. Allerdings wäre dieses Feld besser in Person aufgehoben. Da wohl alle Personen eine Mutter haben (oder hatten). In Beamter gehören nur Methoden/Eigenschaften, die spezifisch für diese Klasse von Personen sind.

It'sNever2Late! schrieb:
Nochmal:
PHP:
Person mutter;
Person vater;
mutter = new Person();
vater = new Beamter();

Im Lernbuch steht, dass vater die Methoden von Person nicht verwenden kann während ihr mir sagt

Wo steht das im Lehrbuch? Der Satz, den Du gepostet hast, gibt das nicht her. Der besagt doch gerade, dass auch vater nur auf Methoden/Eigenschaften von Person zugreifen kann!?
Ergänzung ()

It'sNever2Late! schrieb:
Für mich ist input ein Object vom Typ Scanner innerhalb der Klasse Person.

Wenn Du es so magst. Es bleibt Dir überlassen, wie Du Deine Klassen modellierst. Ich denke, es gehört dort nicht hin.


It'sNever2Late! schrieb:
Erkenntnis:
Das Object sohn vom Typ Person kann keine Methoden der Klasse Beamter aufrufen obwohl es (irgendwie?) auch noch als Beamter deklariert wurde.

Genau dies beschreibt der von Dir zitierte Buchtext!

Die Klasseninstanz die sohn zugewiesen ist, ist übrigens vom Typ Beamter. Dies kannst Du mit instanceof testen. Du ignorierst dies lediglich, und weist den übergeordneten Klassentyp zu. Das ist nicht ungewöhnlich. Man kann dann über die Variable eben nur nicht auf die spezifischen Methoden/Eigenschaften von Beamter zugreifen. Will man das, muss man auch den entsprechenden Typ verwenden. Das kann man auch nachträglich mittels Downcast.

Code:
System.out.println(((Beamter)sohn).sayThis("whatever"));

Sollte sohn keine Instanz vom Typ Beamter sein, tritt ein Fehler auf.

Mit instanceof kann man testen, ob der Typ vorliegt. Programmiert man sauber, sollte das aber kaum einmal notwendig sein.
 
Ich habe deine Erzängung nicht gelesen als ich folgendes verfasst habe

Ich glaube so langsam habe ich es verstanden.

Ein neues Beispiel

Klasse Fahrzeug
Anzahl Räder
Geschwindigkeit

Kasse Moped extends Fahrzeug
Höchstgeschwindigkeit (z.B.)

Klasse Auto extends Fahrzeug
Fenter
Radio
Kofferraum
...

Klasse Fahrzeug hat ne Methode "losfahren" und "anhalten"

Klasse Auto hat ne Methode "Türen öffnen" und "Radio einschalten"

Klasse Moded hat ne Methode "Auf einem Rad fahren" und "360°-Drehung machen"

Auto kann keine Methoden von Moped aufrufen und andersrum genausowenig.

Ich meine ich habe das jetzt verstanden. Also steigern wir das ganze mal etwas:

Der Konstruktor:
Die Klasse Auto und die Klasse Moped bekommt einen
In der wird wird die Anzahl Räder und die Durchschnittsgeschwindigkeit definiert

Bekommt die Klasse Fahrzeug auch einen Konstruktor wenn Auto und Moped einen bekommen? (bzw. sollte Fahrzeug einen bekommen wenn auto und...)

Und noch ne kleine Steigerung:
Implements:
Soweit ich das verstanden habe implementiert (also zwingt) Fahrzeug seine Unterklassen dazu eine Bestimmte Methode bereitzustellen, nur wie schreibe ich das ?
 
Zurück
Oben