Frage zu Java

Gast #3358721
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
Gast #3358732
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.
Gast #3358743
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.
Gast #3358915
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?
#3359504
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren