Variablenübergabe über mehrere Klassen

Bitte aktiviere JavaScript!
Ich bin zurzeit an einem Projekt für die Schule in dem ich nun von einer Server Klasse eine Zufallsnummer an eine Bildschirmausgabe übergeben möchte. Dieses Problem habe ich wie wir es in der Schule gelernt haben versucht mit einer get Methode zu lösen. In der Fehlermeldung möchte der Compiler diese Methode nun static machen, jedoch ist dies der falsche Weg. Aus folgenden drei Klassen (Server, Bildschirmausgabe, Frame) habe ich mal das wichtigste versucht rauszukopieren.
Code:
public class Server
{
    private int port;
    public int cocktailnummer;
    private int x = 1;
    public int nummer;
    public int getNummer(){
      
        return nummer;
   }
   private class EchoThread extends Thread{
        private Socket socket;
        
        public EchoThread(Socket socket){
            this.socket = socket;
        
            
            try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(),true)) {
                //out.println("Server ist bereit ... ");
                String input;
                Random random = new Random();
                nummer = random.nextInt(999999);
                System.out.println("" + nummer);
                out.println(String.valueOf(nummer));
              
                while((input = in.readLine()) !=null){
                    System.out.println(input);
                  
                }
                out.println("123");
                System.out.println("Verbindung abgebaut");
                socket.close();
                //x = 0;
            }catch (IOException e){
                System.err.println(e);
            }
        }
    }
}
Code:
mport javax.swing.JFrame;
import java.awt.Color;
import java.awt.Container;
import java.util.*;

public class Bildschirmausgabe extends JFrame
{
    
    
    
    
    public Bildschirmausgabe(){
        
        super("Bildschirmausgabe");
        Server server = new Server(49566);
        Frame frame = new Frame();
        
      
        
    }
    

    
}
Code:
import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Container;
import java.util.*;

public class Frame extends JFrame
{
    private int nummer1;

public void nummer(){
        nummer1 = Server.getNummer();
}
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
jedoch ist dies der falsche Weg.
Warum??
So wie Du es programmiert hast ("Server.getNummer()" ist halt ein statitsicher Aufruf), wäre das genau richtig!!
Oder Du erzeugst in 'Frame::Nummer' ein neues Objekt von Typ 'Server' und rufst dafür 'getNummer()' auf!

BTW: nenn' die Klasse NICHT Frame!! Frame ist Schlüsselwort bei AWT und könnte ggf. zu Problemen führen!
Überhaupt solltest Du sprechende Variablen verwenden!! 'Server' klingt hier bspw. auch falsch!

VG Klaus
 
Du solltest den Server, den du in Bildschirmausgabe erzeugst, an das Frame weitergeben. (reicht vielleicht schon als Hinweis...)


So wie Du es programmiert hast ("Server.getNummer()" ist halt ein statitsicher Aufruf), wäre das genau richtig!!
Oder Du erzeugst in 'Frame::Nummer' ein neues Objekt von Typ 'Server' und rufst dafür 'getNummer()' auf!
Sie hat vollkommen Recht, irgendetwas static machen, wäre der falsche Weg - man tritt ja auch keine Türen ein, wenn man mit dem Schlüssel in der Hand davor steht...
Genauso wäre dein zweiter Tipp auch der falsch Weg ;)


BTW: nenn' die Klasse NICHT Frame!! Frame ist Schlüsselwort bei AWT und könnte ggf. zu Problemen führen!
Das ist kein Schlüsselwort, sondern einfach ein Klassenname.
Zu Problemen führt das nur, wenn man die falschen imports benutzt - wenn man danach geht, darf man List auch nicht benutzen ;)
 
Du übergibst das Objekt einfach an ein anderes. Das kannst Du z. B. bereits bei der Erzeugung des neuen Objekts machen.

Hier
Java:
        Server server = new Server(49566);
        Frame frame = new Frame();
kannst Du bei der Erstellung des Frame-Objekts auch den Server mitgeben:
Java:
        Server server = new Server(49566);
        Frame frame = new Frame(server);
Dann brauch Frame einen entsprechenden Konstruktor:
Java:
class Frame {
...
    private Server server;

    public Frame(Server server) {
        this.server = server;
    }
Damit verweist jedes Frame-Objekt ein Server-Objekt und kann über den Namen server darauf zugreifen. Zusammen sieht das dann z. B. so aus:
Java:
public class Frame extends JFrame
{
    private int nummer1;
    private Server server;

    public Frame(Server server) {
        this.server = server;
    }

    public void nummer(){
        nummer1 = server.getNummer(); // hier ist server die Kurzschreibweise für this.server
    }
}
 
Passende Stellenanzeigen aus deiner Region:

Oben