tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
1120
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Themanofrofl Themanofrofl ist offline Rookie
    Registriert seit
    May 2011
    Beiträge
    6
    Ich weiß, dass main() static ist und daher kann ich ja folglich keine nicht-statischen Methoden direkt aus der Instanz dieser Klasse in der sich auch main befindet, aufrufen.

    Das ganze ist allerdings auch noch ein bisschen komplizierter. Im Grunde will ich eine Methode aufrufen, die in einem Objekt definiert ist.
    Dieses Objekt steckt allerdings wiederum in einem Array voller dieser Objekte.
    Das Array mit den Objekten wird durch ein weiteres Objekt initiiert, das nur für diesen Zweck erschaffen wurde.

    Schön und gut, also 2 neue Klassen, die eine instanzieren, Methoden durch Punktoperator aufrufen und... cannot find symbol - variable Arrayname.

    Leider bin ich kein Java Guru, habe Java zuletzt vor einem Jahr genutzt und zu allem überfluss will mein Lehrer nicht das man statische Methoden benutzt weil wir das noch nicht hatten.

    Mist, also hier ist wie ich das ganze aufgeschrieben habe:



    //Objekt1
    // code...

    Objekt2[] Arrayname = new Objekt2[Objektanzahl];

    // noch mehr code...



    und in main() siehts dann so aus:


    //Hauptobjekt
    //ganz viel bla
    Arrayname[objektnummer].beispielmethode ;
    //nochmal viel bla


    einer ne Idee was man machen könnte? Ich vermute ja einen Grundlegenden Fehler, so offensichtlich dass ichs erst recht nicht entdecke
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Du solltest dir mal grundlegende Java-Kenntnisse aneignen, z.B. mit Hilfe der Javainsel: http://openbook.galileocomputing.de/...index.htm#_top

    Außerdem wäre es wirklich hilfreich, wenn du deine Code auch in Code-Tags packst, dann lässt er sich leichter lesen (siehe meine Signatur).

    Nun zu deinem Problem:
    Du kannst aus einer statischen Methode heraus sehr wohl nicht-statische Methoden aufrufen. Du musst dafür nur ein Objekt erzeugen (oder dir irgendwie anders Zugriff auf ein Objekt beschaffen). Schematisch:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    public class Starter {
     
       Starter(){// Das hier ist der Constructor
          // hier eingefügter Code wird beim Erstellen eines Objekts von "Starter" ausgeführt.
       }
     
       public static void main(String[] args){
          // hier beginnt die Ausführung deines Programmes
          Starter s = new Starter(); // erzeuge eine Instanz der Klasse "Starter" (=Objekt)
          s.start(); // hier kannst du problemlos eine nicht-statische Methode aufrufen
          // Vorraussetzung: du brauchst eine Referenz auf das Objekt, z.B. indem du es erzeugst
       }
     
       private void start(){
          // ...
       }
    }
     
    }
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Und so als Tipp nebenbei Variablennamen schreibt man klein
    Die Loesung hat dir genodeftest ja schon gegeben
     
    Waere super wenn ihr euren Code in dieser Form einfuegt:
    [JAVA]System.out.println("Test :)");[/JAVA]
    wird zu:
    Code java:
    1
    
    System.out.println("Test :)");
    Tabs sind uebrigens keine Feinde :)
    Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
    Danke :D

  4. #4
    SE Tutorials.de Gastzugang
    Am einfachsten ist es wenn du in der main() eine sog. Selbstinstanzierung machst. Also so

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    import foo.bar.*;
    public class Foo
    {
        public static void main(String[] args) { (new Foo(args)).bar(); }
        public Foo(String[] args)
        {
            //Verarbeitung von args
        }
        public void bar()
        {
            //Eigentlicher Programmstart
        }
    }
    Dadurch erreichst du das du dann ab dem Konstruktor nicht mehr STATIC bist ... und kannst desshalb dann schon auf "this" zugreifen. Ich mache es immer so das ich den Konstruktor private mache damit man die Klasse nicht von externen Klassen aus instanzieren kann und verarbeite dann im Konstruktor erstmal das übergebene String-Array. Die dann aufgerufene Methode ist dann mein eigentlicher Programmstart und wird von mir meist auch private gehalten um den "Einstiegspunkt" nach außen hin zu verstecken. Generell ist bei mir eigentlich alles private. Objekte oder Methoden die ich innerhalb des Package verwende natürlich protected. Die einzige ausnahme bilded mein Plug-In-System in dem zum Zugriff über reflections die nötigen Methoden der Einfachheit halber public sind da ich mit java.lang.reflect.AccessibleObject.setAccessible(boolean) irgendwie Probleme habe. Aber wie gesagt ... das ist die einzige Ausnahme in meinem sonst sehr strengen private/protected-Konzept.
     

  5. #5
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Was im Grunde das selbe ist wie von genodeftest
     
    Waere super wenn ihr euren Code in dieser Form einfuegt:
    [JAVA]System.out.println("Test :)");[/JAVA]
    wird zu:
    Code java:
    1
    
    System.out.println("Test :)");
    Tabs sind uebrigens keine Feinde :)
    Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
    Danke :D

  6. #6
    SE Tutorials.de Gastzugang
    Ähm ... shame on me ...
    Ja natürlich ... ey ich sollte langsam anfangen fremde Codes auch mal verstehen zu wollen ...
    *keinen weiteren Kommentar*
     

  7. #7
    Themanofrofl Themanofrofl ist offline Rookie
    Registriert seit
    May 2011
    Beiträge
    6
    Tschuldigung, dass ich mich so missverständlich ausgedrückt habe und zu allem überfluss nicht die Code Tags genutzt habe.
    War ein wenig in Eile(ist aber auch egal)...

    soo erstmal @genodeftest
    Ich weiß, dass main() static ist und daher kann ich ja folglich keine nicht-statischen Methoden direkt aus der Instanz dieser Klasse in der sich auch main befindet, aufrufen.
    Du kannst aus einer statischen Methode heraus sehr wohl nicht-statische Methoden aufrufen. Du musst dafür nur ein Objekt erzeugen (oder dir irgendwie anders Zugriff auf ein Objekt beschaffen).
    Hmm, ich meine eigentlich das gleiche... Ich kann aber keine nicht-statische Methode aus der Klasse aufrufen in der sich auch main() befindet. Dazu brauche ich (wie du ja auch richtig sagst) ein anderes Objekt das diese Methode beinhaltet.

    Wenn main() gar keine Methode aufrufen könnte, könnte man in Java schließlich auch nicht programmieren (oder halt nur prozedual, was wiederum den Sinn von Java verfehlt).

    Soo, weiter: ich weiß wie man Variablennamer schreibt(klein)

    Bevor ich hier rede und rede und sage was ich gemacht habe und was nicht schaut euch das ganze einfach an.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class Hundeapp{
        public static void main(String[] args){
            Wurfmaschine W1 = new Wurfmaschine();
            W1.sethundeanzahl();
            W1.Hundeerstellen();
            for(int schleife=0;schleife<W1.gethundeanzahl(); schleife++){
                Hunde[schleife].bellen();
                Hunde[schleife].eigenschaften();
            }
        }
    }
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    import javax.swing.*;
    public class Wurfmaschine{
        private int hundeanzahl;
        public void Hundeerstellen(){
            
            //Erstelle Hundeobjekte
            for(int i=0;i<hundeanzahl;i++){       
                
                Hund[] Hunde = new Hund[hundeanzahl]; // Achtung: "Hunde" ist das Array der ganzen "Hund" Objekte!
                                                    // ja, this ist nicht notwendig, ich weiß...
                Hunde[i].setgröße(this.randomgröße());
                Hunde[i].setrasse(this.randomrasse());
                Hunde[i].setname(this.randomname());
                Hunde[i].setgewicht(this.randomgewicht());
                Hunde[i].setanzahlbellen(this.randomanzahlbellen());
                Hunde[i].setlaut(this.randomlaut());
            }
        }
        public void sethundeanzahl() { //Exeptions wären hier unbedingt angebracht!!
            String hundeanzahlstring = JOptionPane.showInputDialog( "Wieviele Hunde sollen geworfen werden?");
            this.hundeanzahl=Integer.parseInt(hundeanzahlstring);
        }
        private double randomgröße(){
            return Math.random()*120;
        }
        private double randomgewicht(){
            return Math.random()*60;
        }
        private String randomrasse(){
            String[] rassen= {"Dalmatiner","Fußhupe","Deutscher Schäferhund","vom Mars","Hax0r"}; 
            return rassen[(int)Math.random()*rassen.length];
        }
        private String randomname(){
            String[] namen= {"Harry","Plokro","Ytsori","Rex","zufig","1337"};
            return namen[(int)Math.random()*namen.length];
        }
        private int randomanzahlbellen(){
            return (int)Math.random()*5;
        }
        private String randomlaut(){
            String[] laute= {"pfuuf","Wuff","Wau","Pasdouf","1337"};
            return laute[(int)Math.random()*laute.length];
        }
        
        public int gethundeanzahl(){
            return hundeanzahl;
        }
    }
    Code :
    1
    2
    3
    
    class Hund{
    //ist eigentlich total unwichtig... es enthält alles und läuft ohne Array ganz normal.
    }

    Der Fehler liegt hier wie gesagt darin, dass er das Objekt im Array nicht anspricht und mir einfach nur sagt:
    "cannot find symbol - variable Hund"
    Klasse Hundeapp Zeile 7 (8 wird dann ja auch falsch sein)

    Also, es wird ein Objekt der Klasse Wurfmaschine instanziert, dann wird aus der Instanz die Methode Hundeerstellen() aufgerufen. Diese macht ihren Dienst auch wie sie sollte. Nur in main() kommt dann die Aufrufung einer Methode in einem Objekt der Klasse Hund, welches sich dann im Array Hunde[] befindet. Und genau dort im Schlussteil läuft es nicht. Ganz simpel sollte man meinen. Dennoch kann ich es nicht.

    Schonmal Danke für die schnelle Antwort und Beratung aber auch schonmal danke für kommende Hilfe

    ps: Wenn nochmal jemand etwas wegen nichteingehaltenen Konventionen sagt, dann lasst euch gesagt sein, dieses Beispielprogramm für meinen Infolehrer ist nicht SOOooo wichtig,
    im ernst... D

    Danke
     

  8. #8
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    Hallo,

    ich sehe in Deinem Code keine Variable, (e.g. Array) die Hunde beinhaltet, in der "Wurfmaschine" (lol) also deutet der Fehler ("cannot find symbol - variable Hund") darauf hin, dass keine Variable mit Namen "Hund" erstellt wurde! (wobei glaub ich Hunde gemeint ist, sonst wäre es ja Dein Klassenname)

    Sieh Dir mal folgenden Code an:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    public class Hundeapp{
        public static void main(String[] args){
            Wurfmaschine W1 = new Wurfmaschine();
            W1.sethundeanzahl();
            W1.Hundeerstellen();
     
            Hund[] hundeArray = W1.getHundeArray();
            for(int schleife=0;schleife<W1.gethundeanzahl(); schleife++)
           {
                hundeArray [schleife].bellen();
                hundeArray [schleife].eigenschaften();
            }
        }
    }


    dazu musst Du die erstellten Hunde in einer lokalen Variable in der Klasse Hund "Containern" also irgendwo speichern.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    import javax.swing.*;
    public class Wurfmaschine{
        private int hundeanzahl;
        private Hund[] hundeArray = null;
        public void Hundeerstellen(){
            //Erstelle Hundeobjekte
    Hund[] Hunde = new Hund[hundeanzahl]; // Achtung: "Hunde" ist das Array der ganzen "Hund" Objekte!
            for(int i=0;i<hundeanzahl;
                                                    // ja, this ist nicht notwendig, ich weiß...
                
                Hunde[i].setgröße(this.randomgröße());
                Hunde[i].setrasse(this.randomrasse());
                Hunde[i].setname(this.randomname());
                Hunde[i].setgewicht(this.randomgewicht());
                Hunde[i].setanzahlbellen(this.randomanzahlbellen());
                Hunde[i].setlaut(this.randomlaut());
            }
                hundeArray = Hunde;
        }
        public void sethundeanzahl() { //Exeptions wären hier unbedingt angebracht!!
            String hundeanzahlstring = JOptionPane.showInputDialog( "Wieviele Hunde sollen geworfen werden?");
            this.hundeanzahl=Integer.parseInt(hundeanzahlstring);
        }
        private double randomgröße(){
            return Math.random()*120;
        }
        private double randomgewicht(){
            return Math.random()*60;
        }
        private String randomrasse(){
            String[] rassen= {"Dalmatiner","Fußhupe","Deutscher Schäferhund","vom Mars","Hax0r"}; 
            return rassen[(int)Math.random()*rassen.length];
        }
        private String randomname(){
            String[] namen= {"Harry","Plokro","Ytsori","Rex","zufig","1337"};
            return namen[(int)Math.random()*namen.length];
        }
        private int randomanzahlbellen(){
            return (int)Math.random()*5;
        }
        private String randomlaut(){
            String[] laute= {"pfuuf","Wuff","Wau","Pasdouf","1337"};
            return laute[(int)Math.random()*laute.length];
        }
        
        public int gethundeanzahl(){
            return hundeanzahl;
        }
        public Hund[] getHundeArray(){
        return hundeArray;
        }
    }

    und vergiss bitte nicht, das Array in hundeErstellen ausserhalb der Schleife zu erstellen, denn sonst ist es immer nur mit einem Hund befüllt!

    Viele Grüße
    Geändert von VScan (08.05.11 um 03:47 Uhr)
    Themanofrofl bedankt sich. 
    „Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
    Georg Christoph Lichtenberg

    Netiquette (vA §15)
    Codetags/Codeboxen
    Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D

  9. #9
    Themanofrofl Themanofrofl ist offline Rookie
    Registriert seit
    May 2011
    Beiträge
    6
    @VScan
    Danke für die Antwort und ja, klar, die Fehlermeldung spricht von "Hunde" nicht von "Hund".
    Ich verstehe nur nicht ganz wieso ich nicht gleich das Array Hunde nutzen kann und noch das Array HundeArray erstellen sollte. erscheint mir redundant.
    Ich erstelle ja per
    Code java:
    1
    
    Hund[] Hunde = new Hund[hundeanzahl];
    ein Array mit genausovielen Hunden drinne wie ich in hundeanzahl angegeben habe. Wozu jetzt nochmal ein Array? Und wieso kann ich das nicht in Hundeapp.main() ansprechen?

    Funktioniert das nicht weil ich das Array in Objekt W1 erstellt habe und das so nicht sichtbar in Hundeapp ist? Muss ich deshalb mir NOCH ein Array erstellen und über den getter das eine Array in das andere packen?
    (so wie du es mit
    Code java:
    1
    
    Hund[] hundeArray = W1.getHundeArray();
    gemacht hast?)

    Würde zwar Sinn ergeben, ist aber ist doch ziemlich umständlich, oder?
     

  10. #10
    SE Tutorials.de Gastzugang
    Aua ... 2 ganz böse Fehler in deinem Source

    1) das Array Hund[] hunde *wirklich ... hier solltest du dich nach der Konvetion richten da beim vergessen des "e" ganz schnell zu extrem langen Error-Meldungen führen kann obwohl es nur an einem Buchstaben liegt* INNERHALB der for() erstellen resultiert in drei Problemen
    a) Hund[] hunde ist außerhalb der for() garnicht bekannt
    b) Hund[] hunde enthält maximal EIN Objekt
    c) Wenn die for() durchgelaufen ist wird Hund[] hunde vom GC wieder aufgeräumt.
    Hier also wirklich auf VScan hören und das Array AUßERHALB der for() erstellen.

    2) Du versuchst in HundeApp auf ein protected-Objekt in Wurfmaschine zuzugreifen. So lange beide Klassen im selben Package sind ist das auch kein Problem. Aber woher soll HundeApp denn bitte Hund[] w1.hunde kennen wenn du nur auf Hund[] hunde zugreifen willst ? Denn das exisitiert in HundeApp so nicht ... nur w1.hunde ... und auch nur dann wenn du es außerhalb der for() erstellst ... ansonsten kennt nicht mal Wurfmaschine selbst diese Objekt.

    Und noch als kleine Anmerkung : Natürlich kannst du auch auf NONE-STATIC - Methode der Klasse zugreifen in der es eine public static void main(String[]) gibt ... nur musst du in der main ein Objekt dieser Klasse erzeugen und dann damit arbeiten.

    Ich glaube dir fehlen hier noch einige Grundlagen die dir dein Info-Lehrer entweder noch nicht vermittelt hat oder die du nicht richtig verstanden hast. Lasse dir deine Fehler am beesten mal von deinem Info-Lehrer erklären da du unsere Erklärungen ja scheinbar auch nicht verstehst.
     

  11. #11
    Themanofrofl Themanofrofl ist offline Rookie
    Registriert seit
    May 2011
    Beiträge
    6
    Moment mal... jetzt hab ich auch mal was zu sagen...

    Ja, Dummerweise habe ich das Array Hunde in der for schleife erstellt. Ist aber längst kein Thema mehr, da es nun außerhalb steht. Darauf hatte mich aber auch schon VScan aufmerksam gemacht. Dieser Fehler liegt aber nicht daran dass ich GAR keine Ahnung habe, sondern mich einfach vertan habe. Soll ja vorkommen können.

    Zu deiner Anmerkung, über Selbstinstanzierungen weiß ich bescheid. ABER: Man kann nicht in der Instanz in der main() läuft, auf Methoden in der selben Klasse zugreifen. Dazu muss ich immer noch EIN OBJEKT ERSTELLEN. Und da kann ich dann auch eins der Klasse erstellen, in der auch main() ist. Ist ja ab dem Zeitpunkt Wurst. Objekt ist Objekt. Ja, was sagst du denn, was ich nicht sag? Immer diese Missverständnisse....

    Es ist nicht so, dass ich kein Java generell kann, die Grundlagen konnte ich, hab nur die letzte Zeit eher mich mit c++ beschäftigt und nun fängt unser Infolehrer mit Java an, weil er meint, das wir das bräuchten und das immer und überall und so weiter und sofort.(Nicht das Java schlecht wäre, Gott bewahre..)

    So, und was du unter 2) schreibst verstehe ich teilweise nicht. Was willst du mir damit sagen?
    Wenn du
    Code java:
    1
    
    W1.Hunde[schleife].bellen();
    schreiben willst, das läuft nicht.


    Übrigens, ich habe alles was VScan schreibt verstanden, da einleuchtend. Jedoch erscheint mir das eine Array überflüssig, weshalb ich nach einer eleganteren Lösung suche. Es sei denn es gibt keine.

    @SPiKEe Da ich wusste, dass das ganze auf ein problem mit meinen halb verdängten Java-Grundlagen zurückkommen wird, hab ich ja extra den ganzen Thread in "Java-Grundlagen" erstellt.


    Nochmal... warum kann ich nicht das Array Hunde in main() ansprechen? und wenn ich es kann, wie? (wenn nicht, warum nicht)

    Danke aber für die Lösung mit dem "HundeArray", das läuft (natürlich nur mit Hunde außerhalb der for-schleife)
    Geändert von Themanofrofl (08.05.11 um 15:29 Uhr)
     

  12. #12
    SE Tutorials.de Gastzugang
    Zitat Zitat von Themanofrofl Beitrag anzeigen
    ABER: Man kann nicht in der Instanz in der main() läuft, auf Methoden in der selben Klasse zugreifen.

    ...

    Ja, was sagst du denn, was ich nicht sag? Immer diese Missverständnisse...
    Lustiger weise liegt hier das Missverständnis bei DIR.
    Guck dir doch oben mal unsere Beispiele zur Selbstinstanzierung an ... man kann sehr wohl auf NICHT-STATISCHE-Methoden aus der MAIN-Instanz zugreifen ... WEIL : Was genau denkst du denn wäre die MAIN-Instanz ... es ist nämlich genau die Instanz die du in deinem Beispiel auch verwendest ... davon abgesehen das du das ganze auch noch prozedual und nicht objekt-orientiert geschrieben hast.


    Das w1.hunde[index] nicht funktioniert ist klar ... aber das solltest du aus deinen Programmiererfahrungen von denen du hier schwärmst wissen ...
    Denn Hund[] hunde ist eine Member-Variable von public void Hundeerstellen(). Damit du nun von außen auf hunde zugreifen kannst musst du es erstmal zu einer Klassen-Variablen machen ... und zwar in dem du die Deklaration außerhalb von public void Hundeerstellen() schreibst. Wenn du jetzt wirklich nicht weist wie ich das meine dann frage deinen Info-Lehrer bitte vorher erstmal über den Aufbau von Klassen aus ... weil ich glaube diese wirklich einfach Grundlage sollte er dir bis jetzt vermittelt haben. Und wenn nicht hilft Google da ein ganzes stück weiter ... dafür muss sich hier keiner von uns Zeit an dir verschwenden ... das machst du bitte selbst wenn du wirklich gewillt bist zu lernen.
    Was deine Meinung zum zweiten "überflüssigen" Array angeht geb ich dir recht. Weil so erhälts du nur eine Kopie des Arrays. Wenn sich das original also ändert bekommst du das in der Kopie schon nicht mehr mit ... darum solltest du OOP-mäßig auch über eine Referenz mit dem Original arbeiten.


    @generic
    Es ist echt immer wieder traurig wie Anfänger hier her kommen , mit ihren Programmiererfahrungen pralen und meinen nur von Java speziell noch nicht so viel Ahnung zu haben. Sind denn andere Sprachen wirklich so anders als Java ? Ich wette nicht. Zumindest die pupolären Sprachen weisen in solchen Punkten gemeinsamkeiten mit Java auf.
    Themanofrofl bedankt sich. 

  13. #13
    Themanofrofl Themanofrofl ist offline Rookie
    Registriert seit
    May 2011
    Beiträge
    6
    Verdammte Axt, jetzt reicht es aber mal langsam, ja?

    Habe ich gesagt ich kenne mich in Java gut aus? nein. Hab ich gesagt, dass ich mir mal gewisse Java Grundlagen angeeignet HATTE? ja.
    Dass ich mich mit C++ beschäftigt habe heißt doch auch nicht, dass ich dort ein Meister meiner Kunst bin, oder?, denn das bin ich garantiert nicht. Prahlen tut man doch auch nicht, wenn man eingesteht, dass man den Großteil wieder vergessen hat, oder? Und überhaupt, wieso eigentlich so unfreundlich?

    Die ganze main-geschichte ist doch eigentlich vollkommen unwichtig. Auch wenn ich immernoch der Meinung bin, dass du schon wieder das gleiche schreibst wie ich. Du hast doch in deinem eigenen Beispiel am Anfang die Klasse mit main instanziert. Also ein Objekt erstellt. In diesem Objekt hast du dann deine Nicht-statische Methode aufgerufen. Aber du musstest ersteinmal dieses Objekt erstellen. Ohne ein Objekt, eine neue Instanz kann ich aus der statischen Methode main auf keine Methode in ihrer Klasse zugreifen, die nicht-statisch ist. Oder auch:
    Static methods can only call other static methods in their class (or they need to use an explicit object for the call)
    Ich lasse mich hier weder zum Vollidioten noch Großmaul abstempeln.(sehr ungern)

    Tut mir leid, dass ich deinen vorherigen post nicht ganz verstanden habe, aber darum muss man noch lange nicht so abwertend werden.

    Es ging mir nur um diesen Fehler den ich gerne beheben möchte. Dass das ganze nicht schön ist und auf jeden Fall besser ginge ist mir auch klar. Darum geht es aber auch gar nicht.

    Fehlermeldung und meine Unwissenheit über "wie rufe ich das ganze denn richtig aus main() auf?" haben mich zu diesem Thread gebracht.

    Und übrigens: Danke für die dennoch enthaltenen Infos in deinem Post. Habe jetzt Hunde gleich in der Klasse deklariert und die main entsprechend angepasst. läuft.

    *Zähneknirschendes Danke*
    Geändert von Themanofrofl (08.05.11 um 19:27 Uhr)
     

  14. #14
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    Hallo,

    vielleicht solltet Ihr beide mal einen Gang zurück schalten, dass er keine Erfahrung hat, ist klar... aber man kann bei diesem primitiven Beispiel eine Ausnahme machen, da es ja unter Grundlagen steht und nicht sehr viel Aufwand erzeugt, bei aufwendigeren Arbeiten würde ich auch sagen, erstmal folgendes studieren: http://openbook.galileocomputing.de/...6c9c510503f310

    (Laut SPiKEe ausgebessert..

    Da es in Java keine Pointer oder Referenzen (zumindest bei primitiven Typen) gibt, kann man ja den Array wie SPiKEe beschrieben hat anders modifizieren (Thema: Zugriffsmodifizierer), z.B. mit "Public", somit muss man den Array nicht nochmal erstellen.
    Das sieht dann wie folgt aus:

    Hundeapp:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public class HundeApp
    {
        public static void main(String[] args)
        {
            Wurfmaschine W1 = new Wurfmaschine();
            W1.sethundeanzahl();
            W1.Hundeerstellen();
     
            for(int schleife = 0; schleife < W1.gethundeanzahl(); schleife++)
            {
                W1.hundeArray[schleife].bellen();
                W1.hundeArray[schleife].eigenschaften();
            }
        }
    }

    dann hier noch die Wurfmaschine:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    
    import javax.swing.*;
     
    public class Wurfmaschine 
    {
        private int hundeanzahl;
        
        /*
         * würde eine ArrayList mit der Thematik <generic> bevorzugen, da es
         * leichter zu handhaben ist, aber das ist eine Fleißarbeit :) siehe
         * "Java ist auch eine Insel"
         */
        public Hund[] hundeArray = null;
     
        public void Hundeerstellen() 
        {
            // array erstellen
            hundeArray = new Hund[hundeanzahl];
            // hund initiieren
            Hund hu = null;
     
            for (int i = 0; i < hundeanzahl; i++) 
            {
                // hund instanzieren
                hu = new Hund();
                hu.setgröße(this.randomgröße());
                hu.setrasse(this.randomrasse());
                hu.setname(this.randomname());
                hu.setgewicht(this.randomgewicht());
                hu.setanzahlbellen(this.randomanzahlbellen());
                hu.setlaut(this.randomlaut());
                hundeArray[i] = hu;
            }
        }
     
        public void sethundeanzahl() {
            String hundeanzahlstring = JOptionPane
                    .showInputDialog("Wieviele Hunde sollen geworfen werden?");
            this.hundeanzahl = Integer.parseInt(hundeanzahlstring);
        }
     
        private double randomgröße() {
            return Math.random() * 120;
        }
     
        private double randomgewicht() {
            return Math.random() * 60;
        }
     
        private String randomrasse() {
            String[] rassen = { "Dalmatiner", "Fußhupe", "Deutscher Schäferhund",
                    "vom Mars", "Hax0r" };
            return rassen[(int) Math.random() * rassen.length];
        }
     
        private String randomname() {
            String[] namen = { "Harry", "Plokro", "Ytsori", "Rex", "zufig", "1337" };
            return namen[(int) Math.random() * namen.length];
        }
     
        private int randomanzahlbellen() {
            return (int) Math.random() * 5;
        }
     
        private String randomlaut() {
            String[] laute = { "pfuuf", "Wuff", "Wau", "Pasdouf", "1337" };
            return laute[(int) Math.random() * laute.length];
        }
     
        public int gethundeanzahl() {
            return hundeanzahl;
        }
     
        public Hund[] getHundeArray() {
            return hundeArray;
        }
    }

    Ich glaube im übrigen auch, dass etwas mehr lesen, z.B. im oben genannten Link, viel helfen würde, ohne dir zu nahe zu treten, wäre es auch angebracht!

    Viele Grüße
    Geändert von VScan (08.05.11 um 20:51 Uhr)
     
    „Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
    Georg Christoph Lichtenberg

    Netiquette (vA §15)
    Codetags/Codeboxen
    Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D

  15. #15
    SE Tutorials.de Gastzugang
    @VScan
    Du weist aber schon das es die JavaInsel mitlerweile in Version 9 gibt oder ? Wäre zumindest etwas aktueller und beschreibt auch einige Veränderungen in den neueren Versionen von Java.
    Auf das offizielle Release von Java7 und einer dazu passendne JavaInsel warte allerdings auch ich schon recht lange.
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 11.04.11, 10:48
  2. Parameter und die Main Methode
    Von der Prof im Forum Java
    Antworten: 1
    Letzter Beitrag: 31.01.08, 11:09
  3. Antworten: 2
    Letzter Beitrag: 06.06.07, 18:37
  4. main-Methode
    Von snatch im Forum Java
    Antworten: 3
    Letzter Beitrag: 20.11.06, 22:48
  5. Antworten: 0
    Letzter Beitrag: 28.01.06, 13:59