Methoden/Klassen Problem

  • Themenstarter Themenstarter JavaPilot
  • Beginndatum Beginndatum
J

JavaPilot

Gast
Hallo 🙂
Ich bitte meine Unwissenheit zu entschuldigen; ich versuche sie mit halbwegs korrekter Orthographie wieder zu kompensieren.
Ich bereite mich auf eine Klausur vor. Dazu habe ich ein Programm geschrieben, welches den Umgang mit Klassen behandelt.
Eine Klasse Buch mit den Eigenschaften Titel und Seitenanzahl, soll hier erzeugt werden und anschließend soll ein Fenster erscheinen und den Titel des erzeugten Buches anzeigen.

Allerdings stimmt etwas an den Konstruktoren oder an der Ausgabe nicht, das Buch wird zwar erzeugt, aber bei der Ausgabe wird "null" ausgegeben.

Für einen erfahrenen Java-Programmierer sollte dies ein Kinderspiel sein, ich bedanke mich trotzdem innbrünstig !

LG


Java:
import java.io.*;
import javax.swing.*;


public class buch {

static int gesamtSeitenanzahl;
 String Titel;
 int Seitenanzahl;

   buch(int a, String b)
 {
   gesamtSeitenanzahl += a;
   int Seitenanzahl = a;
   String Titel = b;

 }

  public  String getTitel(buch Bla){
    return this.Titel;
	  
   }
  
  public  String getTitel(){
	    return  this.Titel;
		  
	   }






 public static void main(String[] args)   {
 String zeile, zeile2; 
  
 
  
  zeile = JOptionPane.showInputDialog ("Geben sie den Buchtitel ein." ); 
  zeile2 = JOptionPane.showInputDialog ("Geben sie die Seitenzahl ein." ); 
  int myint =  Integer.parseInt(zeile2);
    buch blabla = new buch(myint, zeile);
    
  
   
    JOptionPane.showMessageDialog (null, "s"+blabla.getTitel());
 } 


 }
 
Zunächst: Klassen schreibt man Gross, Variablen klein. Du hast es grad genau umgekehrt.
Zum Problem:
Für die Klasse ist eine String Variable Titel deklariert worden (Zeile 8). Die wird im Konstruktor NICHT benutzt. Dort wird noch einmal eine String Variable Titel deklariert (Zeile 15) und mit einem Wert "gefüllt".
Nach Verlassen des Konstruktors ist die Variable aus der Zeile 15 nicht mehr gültig. Die Variable aus Zeile 8 hat ihren Wert (null) nie geändert.
Lösung.

In Zeile 15 statt String Title = b String weglassen.

Hatti
 
Och, das war ja einfach ;D
Und dabei war ich schon wirklich kurz davor, aus dem Fenster zu springen !
Wenn ich so drüber nachdenke, ist das ein banaler Fehler. Gut, es geklärt zu haben.
Nun funktioniert das Programm 🙂

Dankeschön !

Vielleicht ist dieses Programm ja sogar eine Bereicherung, für andere, die soetwas auch programmieren wollen,
und noch nicht so weit waren.

Und jetzt haben wir eine (fast) richtige Musterlösung ! Ist das nicht prächtig : )

Also nochmals vielen Dank 😀
 
Hi

Java:
public class buch {

Klassen Groß schreiben => [c] public class Buch[/c]
Java:
static int gesamtSeitenanzahl;
 String Titel;
 int Seitenanzahl;

   buch(int a, String b)
 {
   gesamtSeitenanzahl += a;
   int Seitenanzahl = a;
   String Titel = b;

 }

1.) public buch(int seiten, String titel); - gescheite Titel erleichtern dir das leben. Da man Klassen groß schreibt, sollte man hier Buch groß schreiben
2) [c] gesamtSeitenanzahl += a[/c] gesamtSeitananzahl wurde nie initalisiert! setze gesamtSeitenanzahl bei der initalisierung auf 0 oder setze eine überprüfung ein
3) Variablen klein schreiben, Konstanten komplett groß
4) Modifer wie public, protected und private verwenden. Zwar wird meines wissens nach alles standart public markiert, wenn nichts dabei steht, aber darauf würde ich mich nicht verlassen.

Java:
  public  String getTitel(buch Bla){
    return this.Titel;
	  
   }

macht keinen Sinn. 2erlei, den Buch hat bereits diese Methode, aber wenn du das verwenden willst, warum auch immer:
Java:
public String getTitel(buch book)
{
    return book.getTitel();  // oder: return book.Titel;
}

Der rest scheint mal auf den ersten Blick ok zu sein. Kann sein dass ich was übersehen habe.

MFG

Tomate_Salat

Edit: Ja ich hab was übersehen, aber mein Vorposter hats ja bereits geschrieben ^^
 
JavaPilot hat gesagt.:
[JAVA=19]
public String getTitel(buch Bla){
return this.Titel;

}

public String getTitel(){
return this.Titel;

}
[/code]
Was wolltest du hier machen?
Oder allgemeiner: Was soll dein Buch alles können?

---

Tomate_Salat hat gesagt.:
1.) [...] Da man Klassen groß schreibt, sollte man hier Buch groß schreiben
Damit keine Verwirring auftritt: Konstruktoren müssen genau gleich heissen wie die Klassen!

Tomate_Salat hat gesagt.:
2) [...] gesamtSeitananzahl wurde nie initalisiert!
Doch, Instanz- und Klassenvariablen werden automatisch auf ihre Standard-Werte gesetzt:
  • Primitive auf 0 / 0.0
  • Referenzen auf
    Code:
    null

Tomate_Salat hat gesagt.:
4) [...] Zwar wird meines wissens nach alles standart public markiert, wenn nichts dabei steht
Nein, alles ohne einen Modifizierer gilt als
Code:
default
, oder auch package-private genannt.
 
Doch, Instanz- und Klassenvariablen werden automatisch auf ihre Standard-Werte gesetzt:
  • Primitive auf 0 / 0.0
  • Referenzen auf
    Code:
    null

Ah ok, trotzdem sollte man alleine wegen eines sauberen Programmierstiles seine Variablen initalisieren, wenn man Sie später modifizieren will.


Nein, alles ohne einen Modifizierer gilt als
Code:
default
, oder auch package-private genannt.

Der Modifer war mir gänzlich unbekannt, da ich immer die Modifizierer [c]public, private oder protected[/c] nutze und mein kleiner Test ergeben hat, dass er dem Public nahe kommt^^, wieder was dazugelernt.
 
Ah ok, trotzdem sollte man alleine wegen eines sauberen Programmierstiles seine Variablen initalisieren, wenn man Sie später modifizieren will.

Naja ... ob ich jetzt

[c]private int iVar = 0;
private Object obj = null;[/c]

schreib, oder einfach

[c]private int iVar;
private Object obj;[/c]

... das nimmt sich nicht viel. Lesbar ist beides gleichermaßen. Imho. Was ich aber gar nicht mag, ist das Zuweisen von konkreten (also von den default-Werten abweichenden) Werten - vor allem wenn man außerhalb von Blöcken jeglicher Art neue Objekte erzeugt. Aber das ist ne rein subjektive Einschätzung.
 
Naja ... ob ich jetzt

[c]private int iVar = 0;
private Object obj = null;[/c]

schreib, oder einfach

[c]private int iVar;
private Object obj;[/c]

... das nimmt sich nicht viel. Lesbar ist beides gleichermaßen.

Hab gegen beide Varianten nichts^^. Du hast mich nicht richtig verstanden: Ich finde man sollte seine Variable einmal initalisieren. Das kann ja auch später im Code passieren wenn man Sie braucht. Wenn ich jetzt z.B. meine Gui baue, gebe ich die Objekte an die ich brauche und initalisiere sie erst dann wenn ich sie brauche und lösche sie auch wieder, wenn Sie unnötig werden.
Also kurz und knapp: sowas finde ich hässlich:
Java:
int zahl;
zahl++;

Imho. Was ich aber gar nicht mag, ist das Zuweisen von konkreten (also von den default-Werten abweichenden) Werten - vor allem wenn man außerhalb von Blöcken jeglicher Art neue Objekte erzeugt. Aber das ist ne rein subjektive Einschätzung.

Du meinst sowas wie:

Java:
JComponent obj = new JLabel();

und dann im Konstruktor
Java:
obj = new JButton();

Falls ja, sind wir einer Meinung. Man kann ja mit dem Initalisieren warten, aber einmal sollte man es dann doch tun.

Mit freundlichen Grüßen

Tomate_Salat
 
Danke nochmal an alle, die sich noch weitere Mühen gemacht haben, mir wertvolle Tipps zu geben : )

Wo ihr so enthusiastisch dabei seid, schließe ich noch schnell eine Frage an:

Ich hatte das Programm ursprünglich aufgespaltet, eine Klasse Buch, und eine Klasse Regal, in der sich die Mainmethode befand. Das heißt, die Klasse Regal enthielt neben der Mainmethode keine anderen anweisungen. So, dann wollte ich in der Mainmethode ein Objekt Buch erzeugen, allerdings meckerte dann der Compiler, die Klasse Buch hätte keinen Konstruktor für das Objekt Regal.

Da war ich dann erstmal verdutzt, ich hoffe ihr könnt mir da ohne Quellcode weiterhelfen, ich habe ihn leider nicht mehr.
Was gilt dabei zu beachten, wenn man von einer Klasse ein Objekt einer anderen Klasse erzeugen möchte ?
Die Methoden waren jedenfalls public, damit man sie von überall aufrufen konnte.

lg
JavaPilot
 
Java:
Buch buch = new Buch();
?! Sofern du den konstruktor von [c]Buch[/c] nicht auf [c]private[/c] gesetzt hast, funktioniert die Geschichte normalerweise.
 

Zurück
Oben