1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java für Anfänger

Discussion in 'Programmieren' started by 0John0, Oct 30, 2009.

Thread Status:
Not open for further replies.
  1. 0John0

    0John0 Kbyte

    Hallo zusammen,
    Ich hatte hier schon mal einen Thread eröffnet mit Anfängerfragen in C++.Nun habe ich meine Schule begonnen,doch nun arbeiten wir mit Java.Natürlich hat mir das kleine Vorwissen in C++ bereits schon viel gebracht was Klassen und Objekten angeht.
    Nun habe wir die ersten Übungen und ich dachte ich könnte hier mal meine kleine Fragen reinstellen,das es hier ein paar Leute gibt mit viel Know-How.
    :)

    Bei diesem Beispiel sehe ich irgndwie nicht wo der Konstruktor sein soll.Der ist ja dazu da,ein Objekt in eine vernünftige Ausgangslage zu setzten?
    Es ist ein "naiver Ticketautomat"

    PHP:
    /**
     
    public class Ticketautomat 
    {
        // Der Preis eines Tickets dieses Automaten.
        private int preis;
        // Der Betrag, der bisher vom Automatenbenutzer eingeworfen wurde.
        private int bisherGezahlt;
        // Die Geldsumme, die bisher von diesem Automaten eingenommen wurde.
        private int gesamtsumme;

        /**
         * Erzeuge eine Maschine, die Tickets zum angegebenen Preis
         * (in Cent) ausgibt.
         * Zu beachten: Der Preis muss größer als Null sein,
         * der Automat überprüft dies jedoch nicht.
         */
        
    public Ticketautomat(int ticketpreis)
        {
            
    preis ticketpreis;
            
    bisherGezahlt 0;
            
    gesamtsumme 0;
        }

        
    /**
         * Liefere den Preis eines Tickets dieses Automaten (in Cent).
         */
        
    public int gibPreis()
        {
            return 
    preis;
        }

        
    /**
         * Liefere die Höhe des Betrags, der für das nächste Ticket bereits
         * eingeworfen wurde.
         */
        
    public int gibBisherGezahltenBetrag()
        {
            return 
    bisherGezahlt;
        }

        
    /**
         * Nimm den angegebenen Betrag (in Cent) als Anzahlung für das
         * nächste Ticket.
         */
        
    public void geldEinwerfen(int betrag)
        {
            
    bisherGezahlt bisherGezahlt betrag;
        }

        
    /**
         * Drucke ein Ticket.
         * Aktualisiere die eingenommene Gesamtsumme und setze den gezahlten
         * Betrag auf Null.
         */
        
    public void ticketDrucken()
        {
             
    // Den Ausdruck eines Tickets simulieren.
            
    System.out.println("##################");
            
    System.out.println("# Die BlueJ-Linie");
            
    System.out.println("# Ticket");
            
    System.out.println("# " preis " Cent.");
            
    System.out.println("##################");
            
    System.out.println();

            
    // Die Gesamtsumme mit dem eingezahlten Betrag aktualisieren.
            
    gesamtsumme gesamtsumme bisherGezahlt;
            
    // Die bisherige Bezahlung zurücksetzen.
            
    bisherGezahlt 0;
        }
    }
     
  2. 0John0

    0John0 Kbyte

    Habe es jetzt gerade herausgefunden:)
    Es ist dieser Abschnitt hier

    PHP:
    public Ticketautomat(int ticketpreis)
        {
            
    preis ticketpreis;
            
    bisherGezahlt 0;
            
    gesamtsumme 0;
        } 
    Aber eine andere Frage

    PHP:
    private  int zaehler;
    private 
    Student sprecher;
    private 
    Server zentral;
    Ich dachte nur so sachen wie int,string etc sind so Typen.
    Warum aber kann man nun auch Student und Server als Typen verwenden?
     
  3. daboom

    daboom Megabyte

    Na das hatten wir doch in Deinem Person-Beispiel damals auch so. Jede Klasse, die Du definierst, ist autmatisch ein Typ.

    Denn streng genommen, bedeutet ja beides fast das gleiche.

    Eine Klasse von Personen (eine Untermenge, die bestimmte Eigenschaften erfüllt) ist ja quasi ein Typ von Personen.

    Und wie solltest Du jemals Deine TicketAutomat-Klasse benutzen, wenn nich als Typ?
     
  4. 0John0

    0John0 Kbyte

    :o Ach ja stimmt ja.ich bin es nochmal nachlesen gegangen.Genau diese Frage hatte ich damals auch.
    Ok,dann mach ich mal weiter ,ich hoffe mit weitern Übungen bekomme ich noch mehr Klarheit
     
  5. 0John0

    0John0 Kbyte

    So das mit Klassen und Datentypen ist mir nun alles klar:) Kein Problem ,wie konnte ich das nicht verstehen;):D

    So banal es sich anhört,ich bekomme einfach nicht folgendes Problem gelöst:

    Ich möchte eine einfache
    PHP:
    System.out.println
    Anweisung ausführen.Und zwar möchte ich 2 Zahlen darstellen in einer Zeile.Diese Zahlen muss ich aber aus einer anderen Klasse holen.Also sieht die gesamte Eingabe so aus.

    PHP:
        System.out.println(feld1.gibZustand(),feld2.gibZustand());
    Doch leider kommt eine Fehlermeldung und zwar "method println(int,int)
    Wenn ich ein + dazwische mache dann rechnet er die Zahlen zusammen.
    Wie kann ich das lösen das ich 2 oder mehrere Zahle in einer Linie darstellen kann?

    Danke für die Antworten
     
  6. daboom

    daboom Megabyte

    Ja das ist ein bischen unglücklich, weil der +-Operator sowohl für die Addition als auch für String-Konkatenation benutzt wird.

    Wenn du es so direkt machen möchtest könntest Du folgendermaßen "tricksen":

    PHP:
    System.out.println("" int1 int2);
    Das wird dann von links nach rechrts abgearbeitet und ergibt damit einen String.
     
  7. 0John0

    0John0 Kbyte

    Danke das funktioniert so:)

    Ich habe zwar heute noch ne Variante hinbekommen diese ist aber sehr schreibeintensiv.Ich denke daher deine idee ist besser.Ich habe einfach die Int in einen String umgewandelt.
    PHP:
     System.out.println(Integer.toString(feld1.gibZustand()) +" "Integer.toString(feld2.gibZustand()) + " " Integer.toString(feld3.gibZustand() ) );
     
  8. 0John0

    0John0 Kbyte

    So hab hier ein weiteres kleines Problem.Ich habe hier ein Notizbuch in dem Personen als Objekte gespeichert werden.Nun muss ich ein Aufgabe machen welche folgendermasse aussieht.Man gibt einen Anfangsbuchstaben ein,vom Datentyp char.Dann vergleicht man die Objekte Personen mit diesem Anfangsbuchstaben.Zum Beispiel "r".Wenn jetzt der Vornamen von 5 Personen mit "r" beginnt.Kommt als return 5.
    Leider schaffe ich es nicht,diesen Vergleich anzustellen.
    Habe hier mal meinen Code:


    PHP:
    /**
         * Sucht  Vornamen der mit dem eingegebenen Buchstaben 
         * beginnt,und gibt die Anzahl der übereinstimmende Objekte aus.
         */
        
    public int zaehleBestimmteAnfangsBuchstaben(char buchstabe){
            
    int uebereinstimmendeObjekte 0;
            
    Iterator <Personit personenliste.iterator();
            while( 
    it.hasNext() ){
                
    Person temp it.next();
                if( 
    temp.gibVorname().contains(buchstabe) ){
                    
    uebereinstimmendeObjekte ++;
                }
            }
            
    System.out.println"Es wurden " uebereinstimmendeObjekte " gefunden. ");
            return 
    uebereinstimmendeObjekte;
        }
     
  9. daboom

    daboom Megabyte

    Was heißt denn "schaffe ich nicht"?

    Laut Code müssten alle Personen gezählt werden, die den Buchstaben enthalten (also nicht nur damit anfangen).

    Mann müsste also lediglich aus dem "contains" ein "startsWith" machen (dabei fein den char in einen String über z.B. ("" + buchstabe) konvertieren) und schon müsste genau das raus kommen.

    Übrigens gibt es ab Java 5 die sogenannte "enhanced for"-Schleife. Alles, was Iterable implementiert oder ein Array ist, kann damit benutzt werden.

    Bei Iterable's wird also prinzipiell immer aus

    PHP:
    final Iterator<Titer iterable.iterator();

    while (
    iter.hasNext()) {
      final 
    T element iter.next();

      
    // ...
    }
    das hier:

    PHP:
    for (final T element iterable) {
      
    // ...
    }
    Wirkt gleich viel eleganter, nich? ;)
     
  10. 0John0

    0John0 Kbyte

    Mhm so wie ich den Code oben geschrieben habe,kommt immer null zurück?Also zum Beispiel schreibe ich "Richner".Bei char nehme ich 'r' und trotzdem kommt 0 zurück.

    Der neue Code müsste also so aussehen`?
    PHP:
    [PHP]/**
         * Sucht  Vornamen der mit dem eingegebenen Buchstaben 
         * beginnt,und gibt die Anzahl der übereinstimmende Objekte aus.
         */
        
    public int zaehleBestimmteAnfangsBuchstaben(char buchstabe){
            
    String neu String.valueOf(buchstabe);
            
    int uebereinstimmendeObjekte 0;
            
    Iterator <Personit personenliste.iterator();
            while( 
    it.hasNext() ){
                
    Person temp it.next();
                if( 
    temp.gibVorname().startsWith(neu) ){
                    
    uebereinstimmendeObjekte ++;
                }
            }
            
    System.out.println"Es wurden " uebereinstimmendeObjekte " gefunden. ");
            return 
    uebereinstimmendeObjekte;
        }
    [/QUOTE][/PHP]
     
  11. 0John0

    0John0 Kbyte

    Ok mit dem Code welche ich aufgeschrieben habe funktionierts.Doch leider habe ich etwas nicht erwähnt weil ich dachte das spiele keine Rolle :rolleyes:
    Es muss erkannt, werden egal ob ich char ein Gross-oder Kleinbuchstabe reinschreibe.
    Irgendwie muss ich doch nun Character.toUpperCase verwenden?Muss ich aber dazu zuerst in einen String verwandeln?Oder geht das direkt von char aus?
     
  12. daboom

    daboom Megabyte

    Du machst das am besten folgendermaßen:

    Du legst Dir ne upper case und ne lower case Variante Deines char-Parameters an (egal, was der nun ursprünglich war). Das machst Du, wie Du schon bemerkt hast, mit Character.toUpperCase() und ...LowerCase().

    Dann machst Du aus beiden jeweils einen String, wie Du es jetzt auch schon machst.

    Schließlich teilst Du Deine Bedingung unten mit dem startsWith() auf, so dass Du prüfst ob, der String mit dem einen ODER dem anderen char anfängt.

    Dann ist groß oder klein egal...
     
  13. 0John0

    0John0 Kbyte

    Bin gerade nicht zu Hause und kann deine Vorschläge erst am Abend probieren.

    Diese Character.toUpperCase() und ...LowerCase() Variante habe ich im Netz gefunden und vorher nocht nicht angwendet.Das funktioniert also wie .equals()?

    Zum Beispiel schreibe ich:
    PHP:
    char buchstabeGross Character.toUpperCase(buchstabe);
            
    char buchstabeKlein Character.toLowerCase(buchstabe)
    Dann verwandel ich die beiden wieder in 2 Strings.

    Und als letzter Schritt mach ich eine if Bedingung mit der ich prüfe ob der Anfangsbichstabe gross ist,ansonsten ist er ja klein.

    Ist das etwa deine Idee? :)
     
  14. daboom

    daboom Megabyte

    So, Moment mal.

    Mit equals hat das upper- und lowerCase Zeugs erstmal nix zu tun. Damit wird einfach nur der gegebene char groß oder klein gemacht, mehr nich.

    Du brauchst nicht zu prüfen, ob der Anfangsbuchstabe groß ist.

    Du prüfst einfach nur, wie ich geschrieben habe, ob der String mit der kleinen ODER (das ist übrigens große geschrieben, als Hinweis, dass in der if-Bedingung auch ein Oder-Operator stehen muss ;)) der großen Variante anfängt.

    Welche von beiden es letztendlich war, interessiert Dich doch dann nicht mehr, oder?

    Ansonsten, ja, das ist in etwa meine Idee ;)
     
  15. 0John0

    0John0 Kbyte

    Ja sorry hab ich wohl falsch geschrieben.

    Eigentlich weiss ich das equals() nichts mit dem anderen zu tun hat.Ich meinte einfach die Art und Weise wie man so etwas benutzt.Nämlich das ich
    "Character.toUpperCase(buchstabe)" aufrufe und in die Klammern das hinein tue was ich umgewandelt haben will.

    Aha ich dachte einfach das ODER beziehe sich einfach auf das if und else :)

    Ok werde das nun mal versuchen.Melde mich dann wieder falls es geklappt hat :rolleyes:
     
  16. 0John0

    0John0 Kbyte

    So es funktioniert :jump:

    Danke für deine Hilfe.
    Früher oder später werde ich mich sowieso hier wieder melden,hoffe du schaust dann wieder vorbei:)

    Hier hab ich noch den fertigen Code.

    PHP:
     public int zaehleBestimmteAnfangsBuchstaben(char buchstabe){
            
    int uebereinstimmendeObjekte 0;
            
            
    char buchstabeGross Character.toUpperCase(buchstabe);
            
    char buchstabeKlein Character.toLowerCase(buchstabe);  
            
            
    String neuGross String.valueOf(buchstabeGross);
            
    String neuKlein String.valueOf(buchstabeKlein);
            
            
    Iterator <Personit personenliste.iterator();
            while( 
    it.hasNext() ){
                
    Person temp it.next();
                if( 
    temp.gibVorname().startsWith(neuGross) || temp.gibVorname().startsWith(neuKlein) ){
                    
    uebereinstimmendeObjekte ++;
                }
            }
            
    System.out.println"Es wurden " uebereinstimmendeObjekte " gefunden. ");
            return 
    uebereinstimmendeObjekte;
     
  17. daboom

    daboom Megabyte

    Nu gluar...

    Meld Dich einfach ;)
     
  18. 0John0

    0John0 Kbyte

    Ich habe mal ne allgemeine Frage.
    Wenn ich eine Klasse Person habe.Welche aus folgenden Methode besteht.
    gibName()
    gibAlter()

    Wenn ich nun 2 Personen Objekte vergleichen möchte,kann ich nicht direkt mit equals() oder == das vergleichen?
    also:
    PHP:
    if(per1 equals(per2) ) ?
    oder muss ich alles einzeln Vergleichen?
    PHP:
    if(per1.gibName().equals(per2.gibName() && per1.gibAlter == per2.gibAlter)
     
  19. daboom

    daboom Megabyte

    Dazu eine kurze Einleitung: ;)

    Wenn Du mit "new" ein neues Objekt, z.B. in Deinem Fall vom Typ "Person" anlegst, wird daf&#252;r ja etwas Arbeitsspeicher reserviert, wo dann die Objektdaten gespeichert werden (in dem Fall z.B. Name und Alter). Beide Objekte haben dann entsprechend eine bestimmte Speicheradresse, also quasi die Stelle im RAM, wo das Objekt abgelegt ist (In C++ w&#228;ren diese Adressen dann quasi die ber&#252;hmt-ber&#252;chtigten Pointer ;)).

    Nun k&#246;nnte es ja sein, dass Du zwei Person-Objekte anlegst, die beiden den gleichen Namen und das gleiche Alter haben, also prinzipiell "gleich" sind. Trotzdem liegen sie an verschiedenen Speicheradressen, sind also sozusagen "nicht dieselben" Objekte.

    Der == Operator vergleicht IMMER genau diese Speicheradressen, zumindest sinngem&#228;&#223;, wird also nur "true", wenn beide Objekte wirklich "dieselben" sind, also an der gleichen Speicheradresse stehen.

    Im Standardfall, also durch die Java Klasse "Object" implementiert, macht "equals" genau dasselbe, also etwa wie folgt:

    PHP:
    public boolean equals(final Object other) {
      return (
    this == other);
    }
    Im Gegensatz zum == Operator kann man die equals-Methode aber &#252;berschreiben, das k&#246;nnte also z.B. Deine Person-Klasse tun.

    Ohne, dass Du sie &#252;berl&#228;dst, w&#228;re es sozusagen egal, ob Du

    PHP:
    per1.equals(per2);
    oder

    PHP:
    per1 == per2;
    machst (mit dem kleinen Unterschied, dass die zweite Variante ne NullPointerException schmei&#223;en w&#252;rde, wenn per1 null w&#228;re).

    &#220;berladen k&#246;nntest Du die equals Methode in der Person-Klasse im Prinzip genau so, wie Du schon geschrieben hast, also in etwa:

    PHP:
    public class Person {
      
    // ...

      
    public boolean equals(final Object other) {
        if (
    other == null) return (false);

        if (
    other instanceof Person) {
          final 
    Person otherPerson = (Personother;

          return (
    this.gibName().equals(otherPerson.gibName()) && this.gibAlter().equals(otherPerson.gibAlter()));
        }

        return (
    false);
      }

      
    // ...
    }
    Der "other"-Parameter von equals ist immer ganz allgemein als "Object" definiert, da man die equals-Methode auch so implementieren k&#246;nnte, dass man z.B. Personen auch mit anderen Objekten vergleichbar haben m&#246;chte. Von daher muss dort der instanceof-Check und der Cast rein, um &#252;berhaupt festzustellen, ob other dort ein Person-Objekt ist (sonst k&#246;nnte man ja nicht auf Name und Alter zugreifen).
    Die null-Pr&#252;fung dort ist auch immer sinnvoll, da man dann ohne Probleme

    PHP:
    per1.equals(null);
    aufrufen k&#246;nnte (was dan false zur&#252;ckgeben w&#252;rde), ohne dass eine NullpointerException geworfen w&#252;rde.

    Edit: Und damit kannst Du dann die equals Methode auf Deinen Person-Objekten so nutzen, wie es eigentlich sinnvoll ist, d.h. zwei Personen sind gleich, wenn sie den gleichen Namen und das gleiche Alter haben.

    Noch als kleiner Hinweis: Wenn man die equals-Methode &#252;berschreibt, sollte man der Sauberkeit halber auch immer die hashCode-Methode &#252;berschreiben. Dazu aber eventuell sp&#228;ter mehr...

    Noch ein kleiner Hinweis: Die equals-Methode sollte immer eine sogenannte "&#196;quivalenzrelation" darstellen. Kannste ja mal schnell auf Wikipedia nachlesen, was das genau bedeutet... Oder fragen... *g*

    So, jetzt hast Du erstmal wieder ein bisschen Material ;)

    Wenn Du Fragen hast, bitte frag :)
     
    Last edited: Feb 7, 2010
  20. 0John0

    0John0 Kbyte

    Also ging eine Weile bis ich nun dazu kam und deine Antwort genau durchzulesen konnte :)
    Denn genau letzte Woche habe wir das in der Schule angeschaut.Und ich glaube es geht in die gleiche Richtung wie du geschrieben hast.
    Also eigentlich kann man es ja nicht direkt vergleichen,man muss es in der jeweiligen Klasse quasi vorbereiten und kann es dann später aufrufen und so vergleichen :)
     
Thread Status:
Not open for further replies.

Share This Page