Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

11

30.11.2015, 18:43

Das Alter ist dafür keine Ausrede. Selbst mit 16 Jahren solltest du schon in der Lage zu sein, den Fehler zumindest zu googlen. Das Problem ist, dass du dann den funktionierenden Code einfach reinkopierst, ohne dir Gedanken zu machen, wieso das funktioniert. Stichwort: Scope, Anonyme Klassen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

12

30.11.2015, 18:43

Dein Alter und ob du ein Genie bist oder nicht, hat damit nichts zu tun.
Denn ja: Das musst du wissen. Wenn du es nicht weißt, dann siehst du ja, dass du deine Probleme nicht gelöst bekommst.

Wenn wir dir jetzt deine "kleine Codeergänzung" geben, dann hast du damit nichts gelernt.
Das ist dann auch nichts, was du geschafft hast und worauf du stolz sein kannst.
Wenn du dein Problem selber lösen kannst, dann kannst du stolz darauf sein.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

30.11.2015, 19:23

Wenn ich das richtig sehe, ist an dem Programm noch mehr falsch. Du erzeugst jedes Mal einen neuen Button und ein neues Label. Nach einiger Zeit hast du dann tausende Buttons und Labels. Und natürlich muss, wie gesagt, die Variable außerhalb der Methode deklariert werden.

Slenderguy

Frischling

  • »Slenderguy« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Schleswig-Holstein

  • Private Nachricht senden

14

30.11.2015, 19:58

@David Scherfgen
Ich habe noch mal ein einfachere Beispiel rausgesucht, das ich gerade programmiert habe.
Nur ein Codeschnipsel

Quellcode

1
2
3
4
JLabel label = new JLabel();
        label.setText("Score : 0" );
        label.setVisible(true);
        add(label);


Quellcode

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
                ballX = ballX + ballSpeedX;
                ballY = ballY + ballSpeedY;
                                
                paddleX2 = ballX;           
                
                if(ballY >= 400 -45){
                    ballSpeedY =  -2;
                }
                if(ballX >= 400 -30){
                    ballSpeedX =  -2;
                }
                if(ballY <= 0){
                    ballSpeedY = ballY +2;
                }
                if(ballX <= 0){
                    ballSpeedX = ballX  +2;
                } 
                
                if(ballY >= paddleY -20 && ballX >= paddleX && ballX <= paddleX + 100) {
                    ballSpeedY = -2 ;               
                }
                if(ballY >= 350){
                    int Score = 0;
                    Score++;
                    label.setText("Score : " +Score);
                }

Score(als Variable) wird nur ein mal repainted, geht also nur bis 2.
Wenn ich Score auserhalb der Methode definiere kann ich es in der Methode nicht verwenden, kannst du mir da weiter helfen ?

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

15

30.11.2015, 20:12

Bei dem Code sieht doch niemand was überhaupt wo in deinem Programm steht. So kann dir keiner eine sinnvolle Auskunft geben, du musst diese Codefetzen schon in irgendeinen Zusammenhang bringen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

30.11.2015, 20:16

Stichwort: Scope, Anonyme Klassen.

Da stehen sehr wichtige Dinge. Weißt du was die bedeuten? Hast du danach mal bei Google geguckt? Oder in irgendeinem Buch mit welchem du hoffentlich Java lernst? Du musst dir vorstellen du hast Grundschulmathe noch nicht richtig gefestigt und möchtest jetzt Aufgaben aus der Oberstufe rechnen. Und du hast jetzt irgendetwas willkürlich zusammen geschrieben und möchtest das von uns korrigiert haben. Etwa so kannst du das vergleichen. Mag ja sein dass du einfach nicht weißt was eine anonyme Klasse ist und in wie fern dass deinen Code da beeinflusst. Aber das wäre dann ja eine Sache die du super nachschlagen könntest. Du musst die Dinger wie du eben hier siehst halt benutzen können und das geht halt nur wenn du weißt was das soll. Das ist nicht böse gemeint, aber du musst halt erst die Grundlagen anschauen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

17

30.11.2015, 20:36

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
if(ballY >= 400 -45){
    ballSpeedY =  -2;
}
if(ballX >= 400 -30){
    ballSpeedX =  -2;
}
if(ballY <= 0){
    ballSpeedY = ballY +2;
}
if(ballX <= 0){
    ballSpeedX = ballX  +2;
} 


Das hier zeigt doch sehr schön, dass du dich nochmal mit stumpfen Konsolenprogrammen auseinandersetzen solltest. (Tipp: [Geschwindigkeit] != [Position + Position]
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

18

30.11.2015, 21:41

Um hier auch noch meinen Senf dazuzugeben:

Selbst wenn man deine bereits genannte Fehlermeldung eins zu eins (selbst mit Rechtschreibfehlern) bei google eingibt kommt man zu mehreren Ergebnissen.
Bei mir ist der erste Treffer problems-with-local-variable-scope-how-to-solve-it, direkt darunter sogar die logische Folgefrage: difference-between-final-and-effectively-final

Im ersten Link sind in der als aktzeptiert markierten Antwort auch Quellen für weitere Recherchen verlinkt (zum Thema "Anonyme Klassen").

Wenn dein Englisch noch nicht so gut ist:
Gehe trotzdem die englischen Beiträge durch und übersetze dir das, was du nicht verstehst.
So kannst du nach und nach immer besser Englisch und musst immer weniger nachschlagen, bis du irgendwann gar nicht mehr nachschlagen brauchst.
Bis dahin: Es gibt auch genug deutsche Quellen.

Damit hier nicht nur gemeckert wird und um dich etwas zu erleuchten:

Du hast folgende Klassen:

Quellcode

1
2
3
4
5
6
7
8
9
10
public class Test {
    public static void main(String[] args) {
        Person personInstance = new Person("Max", "Mustermann", 17);
        whoAreYou(personInstance);
    }

    private static void whoAreYou(Person passedPersonInstance) {
        passedPersonInstance.greetings();
    }
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Person {
    protected String firstname;
    protected String lastname;
    protected int age;

    public Person(String firstname, String lastname, int age) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.age = age;
    }

    public void greetings() {
        System.out.println("Hello, my name is "+firstname+" "+lastname+" and I'm "+age+" years old!");
    }
}


Die Klasse "Person" ist in diesem Fall immer bekannt. Wenn du (oder der Compiler) wissen möchtest, was eine Person ausmacht und welche Methoden diese hat, dann kannst du das einfach in der entsprechenden .java (oder .class) Datei nachgucken.

Jetz aufpassen, damit es nicht zu Verwirrungen kommt!

Anonyme Instanz/Anonymes Objekt (das ist KEINE anonyme Klasse, dazu später mehr)
Damit man nicht jedes mal explizit eine neue Instanz definieren muss, kann man den Konstruktor auch direkt aufrufen.
Durch

Quellcode

1
whoAreYou(new Person("Erika Mustermann", 31));

Vorher hatten wir uns diese unter dem Variablennamen "personInstance" gespeichert. Auch wenn diese Instanz jetzt keinen Namen hat wird natürlich trotzdem ganz normal eine Instanz vom Typ "Person" erzeugt und der Methode übergeben. Hier ist zwar die Instanz anonym, stellt für den Compiler jedoch kein Problem dar, da die Klasse weiterhin genau bekannt ist und er nachgucken kann.

Anonyme Klasse
Nun gibt es Situationen, da möchte man nicht jedes Mal eine neue .java Datei erstellen (zum Beispiel weil der Umfang gering ist, die Klasse nicht wiederverwendet werden soll o.ä.).
Zum Beispiel möchtest du eine Person haben, die sich auch mit ihren Hobbies vorstellt.
Natürlich könntest du eine "PersonWithHobbies"-Klasse erstellen, aber da du die nur in diesem einen speziellen Fall brauchst, ist dir das zu viel.

Nun geben dir die anonymen Klassen folgende Möglichkeit:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {
        Person personInstance = new Person("Max", "Mustermann", 17);
        whoAreYou(personInstance);

        Person anonymousPerson = new Person("Arne","Anonymus", 29) {
            private String[] hobbies = new String[] {"Dancing","Fishing","Programming"};

            @Override
            public void greetings() {
                System.out.print("Hi, you can call me "+firstname+", my lastname is a secret! ");
                listHobbies();
            }

            public void listHobbies() {
                System.out.print("But my hobbies are ");
                for (String hobby : hobbies) {
                    System.out.print(hobby + " ");
                }
                System.out.println();
            }
        };

        whoAreYou(anonymousPerson);
    }


Die Objektinstanz "anonymousPerson" wurde mit Hilfe einer anonymen Klasse erzeugt!
Du siehst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Person anonymousPerson = new Person("Arne","Anonymus", 29) {
            private String[] hobbies = new String[] {"Dancing","Fishing","Programming"};

            @Override
            public void greetings() {
                System.out.print("Hi, you can call me "+firstname+", my lastname is a secret! ");
                listHobbies();
            }

            public void listHobbies() {
                System.out.print("But my hobbies are ");
                for (String hobby : hobbies) {
                    System.out.print(hobby + " ");
                }
                System.out.println();
            }
        };


Durch diese Deklaration wurde der Klasse "Person" ein Array mit Hobbies und eine Methode hinzugefügt, um diese Auszugeben.
Die Klasse "Person" hat diese Eigenschaft aber gar nicht. Dennoch ist offensichtlich eine Klasse entstanden, die trotzdem eine Person ist (sonst würde sie von der "whoAreYou"-Methode nicht entgegen genommen werden können) und diese Klasse erweitert.
Diese entstandene Klasse ist jedoch sonst nirgendwo definiert.
Es gibt keine .java Datei in der Ihre konkrete Definition stünde, ebenso gibt es keine .class Datei, in der der Compiler nachsehen könnte.. sie ist anonym.

Auch schön ist (und genau das machst du dir bei deinem ActionListener zu Nutze), dass das ganze auch mit Interfaces funktioniert. Dieses definiert lediglich ein Verhalten (also Methoden).
Dem Compiler ist völlig Wurst welche Klasse es ist. Sobald sie den ActionListener implementiert und seine "actionPerformed"-Methode implementiert, es diese Klasse de Facto ein ActionListener.

Was passiert hinter der Bühne?

Du würdest auf exakt das gleiche Ergebnis kommen, wenn du statt der anonymen Klasse eine richtig implementieren würdest.
Also zum Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AnonymousPerson extends Person {
    private String[] hobbies = new String[] {"Dancing","Fishing","Programming"};

    public AnonymousPerson(String firstname, String lastname, int age) {
        super(firstname, lastname, age);
    }

    @Override
    public void greetings() {
        System.out.print("Hi, you can call me "+firstname+", my lastname is a secret! ");
        listHobbies();
    }

    public void listHobbies() {
        System.out.print("But my hobbies are ");
        for (String hobby : hobbies) {
            System.out.print(hobby + " ");
        }
        System.out.println();
    }
}


Aus diesem Grund dürfen die Properties der "Person"-Klasse übrigens auch nicht private sein, sonst könnten sowohl die anonyme, als auch die "AnonymousPerson"-Klasse nicht darauf zugreifen.

Java nimmt dir hier einige Arbeiten ab (bei Interfaces implementiert die anonyme Klasse dieses automatisch, der Konstruktor der Oberklasse wird einfach übernommen etc.)
Schlussendlich ist das lediglich syntaktischer Zucker.

Um dir zum Abschluss trotzdem nochmal auf die Finger zu klopfen:
Bleib an Themen dran, wenn du sie nicht verstehst.
Bei kleinsten Schwierigkeiten ständig alles fallenzulassen und etwas neues anzugehen hilft dir nicht weiter.

Wie von anderen bereits erwähnt:
Bei deinen Codebeispielen stimmen schon Punkte zu den Grundlagen nicht.

Programmieren ist nunmal nicht einfach und selbst wenn du es "kannst" wirst du dir an vielen Stellen immer wieder die Zähne ausbeißen.
Ich muss mich auch immer wieder in neue Frameworks/Libraries und neue Projekte reinarbeiten.
Nicht selten verbringt man Stunden damit Dinge auszuprobieren, Dokumentationen zu lesen und kleine Testprojekte zu erstellen, nur um dann festzustellen, dass der Ansatz doch nicht so gut war und wieder von vorne anzufangen.

Dein Alter ist egal und zu blöd bist auch nicht, wenn du etwas nicht sofort verstehst.
Vielleicht bist du einfach nur zu ungeduldig... denn wichtig ist nur eines: dranbleiben!

PS: So rein aus Interesse.. was hast du eigentlich für ein Buch? (Titel?)
Wenn dort solche Codeschnipsel (und dann noch ohne oder mangelhafter Erklärung) drin stehen würde ich das rituell verbrennen..

An den Rest:
Sollte ich etwas umständlich (oder sogar falsch :S) erklärt haben, bitte korrigieren :)
Das Schreiben wurde durch Duschen, Essen und einem Telefonat unterbrochen x) Möglich, dass sich Fehler eingeschlichen haben ^^

19

30.11.2015, 22:43

Die "whoAreYou(Person)"-Methode befindet sich in der Test-Klasse (siehe Codeausschnitt #1, unten) und ruft tatsächlich nur die greetings()-Methode auf :)
Da das jedoch die einzige Stelle ist, die die gesamte Test-Klasse enthält (da ich später nur noch auf die main-Methode eingegangen bin) taucht sie später nicht mehr auf :)

Zitat

Natürlich muss irgendwo schon eine Definition dieser Klasse vorhanden sein. Anonyme Klassen überschreiben aber diese Definition dann.

Um ganz kleinkariert zu sein:
Man kann in Java keine Klasse "einfach so" definieren.. das gilt auch für normale Klassen.
Alle Klassen brauchen irgendwo eine "Grunddefinition", die sie dann erweitern können. Diesen kleinsten gemeinsamen Nenner stellt die Object-Klasse dar, von der alle Klassen implizit erben.

"class Person" ist also eigentlich "class Person extends Object" und ebenfalls nur syntaktischer Zucker :)

Also theoretisch könnte man sowas machen wie

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    static Object cat = new Object() {
        private Color furColor;
        
        public void makeNoise() {
            System.out.println("Miau");
        }
    };
    
    static Object truck = new Object() {
        private int horsePower;
        
        public void makeEvenLouderNoise() {
            System.out.println("Brumm~");
        }
    };


Dann hätte man natürlich keinerlei Chance mehr diese Klassen auseinander zu halten. Alles wäre immer nur Object :)

(Der Compiler übrigens auch nicht. Die "personInstance" vom vorherigen Beispiel hat im Debugger den Wert "main.Person@1a93a7ca", die "anonymousPerson"-Instanz hingegen "main.Test$3@66cd51c3".. also einfach den Typen der Klasse, in der sie benutzt wird und dann "$3" als Aufzählung).

Edit:
Die "$3" kommt zustande, weil ich beim Ausführen bereits die beiden anonymen Klassen von "cat" und "truck" implementiert hatte.. ohne diese wäre es also "$1" (keine Ahnung warum nicht "$0" ?( )

Und noch Vollständigkeit halber:
Die Informationen zur Instanz bzw. der anonymen Klasse bleiben schon noch erhalten.
So kann die Klasse bzw. ihre Instanz via Reflection trotzdem noch "bearbeitet" werden

Der Aufruf folgender Methode in der main-Methode via analyze(cat);

Quellcode

1
2
3
4
5
6
7
8
9
10
public static void analyze(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        System.out.println("Class: '"+obj.getClass()+"'");
        System.out.println("Methods: ");
        for (Method m : obj.getClass().getMethods()) {
            System.out.println("\t"+m.getName());
        }
        System.out.println("\nInvoke Method 'makeNoise':");
        Method makeNoiseMethod = obj.getClass().getMethod("makeNoise");
        makeNoiseMethod.invoke(obj);
    }


Gibt folgenden Output:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class: 'class main.Test$1'
Methods: 
    makeNoise
    wait
    wait
    wait
    equals
    toString
    hashCode
    getClass
    notify
    notifyAll

Invoke Method 'makeNoise':
Miau

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »InselÄffchen« (30.11.2015, 23:05) aus folgendem Grund: Erklärungen ergänzt


Slenderguy

Frischling

  • »Slenderguy« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Schleswig-Holstein

  • Private Nachricht senden

20

01.12.2015, 15:25

Wie kann ich 2 JLabel in dem selben JPanel getrennt so hinstezen wo ich möchte ?
Im Internet hab ich es so nicht gefunden.
Ich meine nicht die Größe oder Font, sondern z.B. wie beim JButton im Frame(.setBounds()).

Werbeanzeige