簡體   English   中英

Java中的實例變量范圍

[英]Instance variable scope in java

大家好!

我正在用Java為網吧創建網絡程序。 我的服務器有此代碼

    import java.io.*;
    import java.net.Socket;
    import java.net.ServerSocket;

public class Server
{
    private String name;
    private int id;

    private Socket socket = null;
    private ServerSocket serversocket = null;
    private ObjectInputStream ois = null;

    public Server()
    {
        new Thread(receive).start();

        while(true)
        {
            try
            {
                serversocket = new ServerSocket(4445);
                socket = serversocket.accept();
                System.out.println("Connected..");
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }

    }

    Runnable send = new Runnable(){
        public void run ()
        {

        }

    };

    Runnable receive = new Runnable(){
        public void run ()
        {
            while(true)
            {
                try
                {
                    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    User user = (User) ois.readObject();
                    System.out.println(user);
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
                catch(ClassNotFoundException e)
                {
                    e.printStackTrace();
                }
            }
        }
    };

    public static void main(String [] args)
    {
        new Server();
    }
}

我的問題是我無法在Runnable接口代碼內訪問實例變量。

例如“ socket”實例。 無法在此代碼內訪問

Runnable receive = new Runnable(){
        public void run ()
        {
            while(true)
            {
                try
                {
                    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    User user = (User) ois.readObject();
                    System.out.println(user);
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
                catch(ClassNotFoundException e)
                {
                    e.printStackTrace();
                }
            }
        }
    };

最好的方法是什么?為什么在該代碼內無法訪問?

為什么? 答案是: 為什么只能在匿名類中訪問最終變量?

如果需要從服務器訪問套接字,則應在Server類上將Socket socket聲明為最終變量。

嘗試這個

public Server() {
    try {
        serversocket = new ServerSocket(4445);
        while (true) {
            socket = serversocket.accept();
            new Thread(receive).start();
            System.out.println("Connected..");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果我沒記錯的話,您需要將套接字字段定為final。 原因現在逃避了我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM