Forum: PC-Programmierung Frage zu Java


von Manfred L. (Gast)


Lesenswert?

Hallo zusammen,

ich habe gestern ein Programm geschrieben und bin dabei auf folgendes 
gestoßen, was mir unerklärlich erscheint:

Folgender Code:
1
//Version: 2.0, 10.10.2013
2
//Author: Samuel Ioannidis
3
//Code function: Simple program for calculation of average speed
4
//               based on km/h 
5
//Copyright: Samuel Ioannidis, 10.10.2013
6
7
import java.awt.*;
8
import java.awt.event.*;
9
10
import javax.swing.*;
11
12
public class averagespeed extends JFrame
13
{  
14
  
15
    int status=2;
16
    
17
    averagespeed()
18
    {  
19
      ...
20
      
21
      
22
      JRadioButton hrs = new JRadioButton("hrs");
23
      hrs.setMnemonic(KeyEvent.VK_H);
24
        hrs.setActionCommand("hours");
25
        hrs.addActionListener(new SetTimeAction());
26
      
27
      ...
28
      
29
    }
30
    
31
32
    
33
    class SetTimeAction  implements ActionListener
34
    {
35
      status = 8;    // warum kommt hier ein Fehler?
36
      public void actionPerformed(ActionEvent e)
37
      {
38
        
39
        if(e.getActionCommand()=="hours")
40
        {
41
          // mache etwas....
42
43
        }  
44
      }    
45
    }
46
47
    
48
    public static void main(String[] args) 
49
  {
50
    averagespeed averagenew = new averagespeed();
51
    averagenew.pack();
52
    averagenew.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
53
    averagenew.setSize(600, 200);
54
  }
55
}


Warum ist die Variable "status" in der "SetTimeAction"-Klasse nicht 
sichtbar?


Danke und Gruß
Manfred

von Stefan R. (srand)


Lesenswert?

Manfred L. schrieb:
> Warum ist die Variable "status" in der "SetTimeAction"-Klasse nicht
> sichtbar?

Ist sie doch. Nur wieso glaubst du, du könntest Code außerhalb von 
Methoden haben?

Falls du das als Initialisierung meinst, das geht das wohl mit passend 
plazierten geschweiften Klammern. Aber sicher bin ich mir da nicht, Java 
ist schon zu lange her.

von Stephan (Gast)


Lesenswert?

Manfred L. schrieb:
> class SetTimeAction  implements ActionListener
>     {
>       status = 8;    // warum kommt hier ein Fehler?
>       public void actionPerformed(ActionEvent e)
>       {

Hier wird der Variablen status ein Wert zugewiesen. Das geht nur 
innerhalb einer Methode. Oder es fehlt hier ein Typ-Bezeichner, dann 
wäre es eine Variablendeklaration (neue Variable status, nicht mehr die 
der umgebenden Klasse) mit Initialisierung.
Gruß
S.

von Roland P. (pram)


Lesenswert?

Hab auch noch was:
1
if(e.getActionCommand()=="hours")
mach Stringvergleiche besser ein .equals

Gruß
Roland

von c. m. (Gast)


Lesenswert?

Manfred L. schrieb:
1
 public class averagespeed extends JFrame
2
 {
3
     private int status=2;
4
     public void setStatus(int _value) {
5
        status=_value;
6
     }
7
 ...
8
 hrs.addActionListener(new SetTimeAction(this));
9
 ...
10
     }
11
     class SetTimeAction(averagespeed _avs)  implements ActionListener
12
     {
13
       avs.setStatus(8);
14
       //status = 8;    // warum kommt hier ein Fehler?
15
       public void actionPerformed(ActionEvent e)
16
       {
17
         if(e.getActionCommand()=="hours")
18
         {
19
           // mache etwas....
20
         }
21
       }
22
     }

so ungefähr.

von Tobias K. (t_k)


Lesenswert?

@Manfred: Tipp: Access-Modifier besser explizit benennen, das hilft beim 
Verständnis bzgl. Sichtbarkeit. Und beim Suchen im Netz.
@C.m.: Von inner Classes aus ohne Setter Schreiben finde ich jetzt OK. 
Ansonsten gibt's ja keinen echten Sinn für "inner"?

von Manfred L. (Gast)


Lesenswert?

Hallo nochmal. Erstmal Danke!

Aber: wenn ich von der Klasse averagespeed erbe, klappt das auch nicht?!
Warum funktioniert das überhaupt, innerhalb der Hauptklasse eine Klasse 
zu definieren?

Wenn ich die Variable status in der Hauptklasse "public" mache sehe ich 
sie in der unteren ebenfalls nicht....

Koenntetihr mir helfen?

von Karl H. (kbuchegg)


Lesenswert?

Hier
1
    class SetTimeAction  implements ActionListener
2
    {
3
      status = 8;    // warum kommt hier ein Fehler?
4
      public void actionPerformed(ActionEvent e)
5
      {
6
        
7
        if(e.getActionCommand()=="hours")
8
        {
9
          // mache etwas....
10
11
        }  
12
      }    
13
    }

fängt doch erst mal eine neue Klasse an.
Daher ja auch das Schlüsselwort 'class'.
Dann definierst du wie die Klasse heisst und von wem sie erbt.

Und dann?
Dann müsstest du erst mal die Methoden der Klasse auflisten. Hast du ja 
hier auch gemacht
1
public class averagespeed extends JFrame
2
{  
3
  
4
    averagespeed()
5
    {  
6
       ...
7
    }
8
    
9
    
10
    public static void main(String[] args) 
11
  {
12
    ....
13
  }
14
}

eine ausführbare Anweisung kann nur innerhalb einer Methode einer Klasse 
stehen!
Nur bitte, innerhalb welcher Methode steht dann das
1
        status = 8;
Da ist keine Methode definiert.


Das hier
1
public class averagespeed extends JFrame
2
{  
3
  
4
    int status=2;
ist was anderes! Das ist eine Initialisierung! Erkennbar daran, dass die 
Wert-'Zuweisung' bei der Variablendefinition steht. Da wird in erster 
Linie eine Member-Variable definiert
1
    int status;
und damit man da nicht lang fackeln muss, wird sie auch gleich noch 
intialisiert.
1
    int status=2;

Aber den Fall hast du ja hier nicht
1
    class SetTimeAction  implements ActionListener
2
    {
3
      status = 8;    // warum kommt hier ein Fehler?
das ist keine Initialisierung. Das ist eine hundsordinäre Zuweisung! Und 
die kann als solches nur in einer Methode stehen. Das kann jetzt im 
Konstruktor sein
1
    class SetTimeAction  implements ActionListener
2
    {
3
4
      SetTimeAction()
5
      {
6
         status = 8;
7
      }

oder in irgendeiner anderen Member-Funktion
1
    class SetTimeAction  implements ActionListener
2
    {
3
4
      public void foo()
5
      {
6
         status = 8;
7
      }

aber egal wie, es muss auf jeden Fall innerhalb einer Methode sein!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.