[Resolvido] Métodos Estáticos

Eu to fazendo um programa de ponto eletônico e to com várias dúvidas, mas a principal é a seguinte: Eu tento colocar um trecho de código dentro do main mas ele da erro pois o trecho não é estático, e eu não sei como devo fazer, esta é a linha que da erro:

(t[i] = new clientThread(clientSocket,t)).start();

onde:

static  clientThread t[] = new clientThread[10];

e o clientThread é:

[code]class clientThread extends Thread{

DataInputStream is = null;
PrintStream os = null;
Socket clientSocket = null;       
clientThread t[];

public clientThread(Socket clientSocket, clientThread[] t){
this.clientSocket=clientSocket;
    this.t=t;
}

public void run(){
    
String line;
    String name;
try{
    is = new DataInputStream(clientSocket.getInputStream());
    os = new PrintStream(clientSocket.getOutputStream());
    os.println("Digite seu nome:");
        System.out.println("Cliente se conectando...");
    name = is.readLine();
    os.println("Olá "+name+", bem vindo ao chat.\nPara sair, digite /quit em uma nova linha");
    System.out.println("Cliente conectado! Nome utilizado: "+name);
    for(int i=0; i<=9; i++)
	if (t[i]!=null && t[i]!=this)  
	    t[i].os.println("*** Um novo usuário, "+name+", entrou na sala ***" );
    while (true) {
	line = is.readLine();
            if(line.startsWith("/quit")) break; 
	for(int i=0; i<=9; i++)
	    if (t[i]!=null)  t[i].os.println("<"+name+"> "+line); 
    }
    for(int i=0; i<=9; i++)
	if (t[i]!=null && t[i]!=this)  
	    t[i].os.println("*** O usuário "+name+" esta saindo da sala ***" );
    
    os.println("*** Tchau "+name+", volte sempre ***"); 

    // Clean up:
    // Set to null the current thread variable such that other client could
    // be accepted by the server

    for(int i=0; i<=9; i++)
	if (t[i]==this) t[i]=null;  
	
    // close the output stream
    // close the input stream
    // close the socket
    
    is.close();
    os.close();
    clientSocket.close();
}
catch(IOException e){};
}

}[/code]

Alguém pode me dar uma dica de como resolver? Pois preciso entregar esse projeto na quarta feira…

Não declare t como estático, declare-o assim:

clientThread t[] = new clientThread[10];

Além do mais, a classe clientThread não foi declarada como pública, o que faz com que ela esteja acessível somente dentro do pacote em que ela foi declarada. Declare essa classe como pública, para evitar dores de cabeça.

Se eu não declarar t como estático, ele da erro em todas as menções da variavel…

Eu fiz da seguinte forma: deixei t como estático, declarei a classe clientThread como publica como você disse e tambem estática…

Os erros anteriores sumiram, mas agora eu não posso usar o comando .append() que é essencial no meu programa, alguma sugestão?

[quote=Yago Ernandes]Se eu não declarar t como estático, ele da erro em todas as menções da variavel…

Eu fiz da seguinte forma: deixei t como estático, declarei a classe clientThread como publica como você disse e tambem estática…

Os erros anteriores sumiram, mas agora eu não posso usar o comando .append() que é essencial no meu programa, alguma sugestão?[/quote]

Você deve estar fazendo alguma salada. Primeiro, não declare a classe como estática. Segundo, se você precisou declarar t como estático, é sinail de que o(s) método(s) que chama(m) t é(são) estático(s). Não delcare métodos como estáticos, à menos que seja realmente preciso.

o método que chama t é o:

public static void main(String args[])

ou seja, ele é estático. Enquanto a classe, quando eu a declarei como estática, o programa rodou perfeitamente com o System.out.println(), mas queria que ele aparecesse na TextArea com o comando .append(), porque não pode declará-la como estática?

[quote=Yago Ernandes]o método que chama t é o:

public static void main(String args[])

ou seja, ele é estático. Enquanto a classe, quando eu a declarei como estática, o programa rodou perfeitamente com o System.out.println(), mas queria que ele aparecesse na TextArea com o comando .append(), porque não pode declará-la como estática?[/quote]
Hora, então faça mais fácil. Primeiramente não declare a classe clientThread como estática. Depois, basta declarar o vetor t dentro do próprio método main:

public static void main(String args[]) { clientThread t[] = new clientThread[10]; }

mas a classe clientThread também é chamada dentro do método main, o que devo fazer quanto a ela se não é aconselhável declará-la como estática?

Ah, o vetor t não deu mais problema declarando-o dentro da main(), muito obrigado, mas a classe sim

Declare a variável normalmente. Quando você faz

public static void main(String args[]) { clientThread t[] = new clientThread[10]; }

não precisa declarar a classe clientThread como estática.

Se eu não declará-la, a mesma linha da erro…

Poste a declaração com erro.

Linha que da erro:

(t[i] = new clientThread(clientSocket, t)).start();

erro:

non-static variable this cannot be referenced from a static context

o vetor t que eu declarei denbtro da main, não me deu mais problemas, mas ela precisa ser instanciada com a classe clientThread, e é esse o problema

Um método não estático não pode ser utilizado dentro de um estático sem a classe ter sido instanciada. Agora uma método estático pode ser acessado.
Para acessar um metodo ou atributo ou estatico de uma classe, tem que instanciar primeiro.

mas nesse caso, como eu instanciaria essa classe? Eu tentei aqui e não consegui :cry:

[code] ClientThread client = new ClientThread(socket, clientThread[]);
client.getATributoQueVoceQuer();
//ou
client.atributo;

[/code]

http://pt.wikibooks.org/wiki/Java/Modificadores
http://www.guj.com.br/articles/121

Esses links irão te ajudar no restante.

Eu agradeço a ajuda de todos, ainda não consegui mas vou dar uma lida nos links que o ErickRAR me passou, obrigado.