Problemas com métodos estáticos

Pessoal, estou com uns problemas na implantação de um exercício.
Devo criar uma aplicação para calcular a média e desvio padrão de um conjunto de medidas. Até aí tudo bem, fácil !
O problema é a forma pela qual devo fazê-lo.
Devo criar uma superclasse chamada Estatistica com os atributos int n, valor[] double e prob[] double.
Devo também criar uma classe filha chamada EstatisticaIndutiva que está ligada por herança à superrclasse. nessa classe filha deve-se fazer os cálculos necessários e a apresentação dos dados na tela.
A classe EstatisticaIndutiva de conter os seguintes atributos e métodos:

[b]
Atributos:

saida: String
media: Double

Métodos:

public EstatisticaIndutiva()
public EstatisticaIndutiva(media:double)
Calcula media: double
CalculaDesviopadrao(): double
MostraResultados(media: double, desvio:double)
Main()
[/b]

Por enquanto, para fins de testes, criei apenas a superclasse Estatistica

Essa classe será a responsável por ler esses valores, ou seja, a quantidade de dados, os valores dos dados e seus respectivos pesos.
Para isso devo criar métodos nessa superclasse que são os seguintes:


Estatistica()
CapturaNumeroDados()
CapturaDados()
Main()

Fiz essa classe apenas com o método main e funcionou tudo direito. Mas quando fui implementar da maneira que deve ser feito começa a dar erros que ainda não sei resolver. Erros do tipo “Não se pode fazer referência estática a campos não estáticos” e coisas do tipo.
Aí notei que se colocasse um método para fazer a captura dos dados resolveria esse problema declarando dentro do método os vetores valor[] e Prob[] com seus respectivos números de dados.

Mas o problema agora está na chamada do método.

Está dando o seguinte erro na linha 80:

Imposível fazer uma referência estática para o método não-estático mostraDados() do tipo Estatistica.

Quando passo o parâmetro n para o método o erro persiste.
Quando coloco a palavra [/b]static[b] na frente da declaração do método, dá problemas nas linhas 57, 59 e 60 do tipo:

[/b]Não é possível fazer uma referência estática ao campo não estático n (linha 57)
Não é possível fazer uma referência estática ao campo não estático valor (linha 59)
Não é possível fazer uma referência estática ao campo não estático Prob (linha 60)[b]

Já tentei passar o valor de n como parâmetro, mas sempre dá erros que não sei resolver.

Estou certo de que estou me embananando com os métodos. Alguém poderia dar uma ajuda aí, por favor ?

O código está logo abaixo:

package mediaEDesvio;

import javax.swing.JOptionPane;
public class Estatistica
{
	// Declara as variáveis utilizadas na superclasse Estatistica:
	public int n;
	public double valor[];
	public double Prob[];
	
	// Método construtor implícito para a classe Estatistica
	public Estatistica()
	{		
	}

	/*
	  Define o método capturaNumeroDados.
      Captura a quantidade de elementos a serem tratados
      Define os vetores valor e Prob com a quantidade de
      elementos definida pelo usuário.
    */
	
	public static int capturaNumeroDados()
	{	  
	    String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados");
        int n = Integer.parseInt(k);
        return n;
	 }
	
	
	/*
	   Define o método capturaDados
	   Captura os dados e os pesos de cada valor e os aloca
       em seus respectivos vetores/;
	*/
	
	public static void capturaDados(int n)
	{
	  double valor[] = new double[n];
      double Prob[] = new double[n];
	  for(int i=0;i<n;i++)
      {
	     String dado = JOptionPane.showInputDialog(null, "Qual o valor do dado " + (i+1));
	     double val = Double.parseDouble(dado);
	     valor[i] = val;
	   
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");
	     double pes = Double.parseDouble(peso);
	     Prob[i] = pes;
      }
	}
	
	// Método mostraDados
	 public static void mostraDados()
	 {

		 for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }
	 }
	
	
	public static void main(String args[])
	{
		 /* 
		    Chama o método capturaDados e cria os vetores
		    com o número dos dados digitados pelo usuário.
		 */
		
         int n = capturaNumeroDados();
         double valor[] = new double[n];
         double Prob[] = new double[n];
       
         /* Chama o método capturaDados passando como argumento
            o valor n (número de dados)
         */
         
         capturaDados(n);
         mostraDados();
         
         //Teste
         
         for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }       
	}	
}

Olá Valder Olmo Corrêa,

Para vc utilizar as variavies:

// Declara as variáveis utilizadas na superclasse Estatistica: public int n; public double valor[]; public double Prob[];
Vc tem duas opções, ou vc as torna estáticas, para poderem ser utilizadas dentro de metodos estáticos

// Declara as variáveis utilizadas na superclasse Estatistica: public static int n; public static double valor[]; public static double Prob[];
Ou vc não declara os metodos de sua classe como estaticos…

public int capturaNumeroDados() { String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados"); n = Integer.parseInt(k);// variavél n de sua classe qeu está declara sem ser estática return n; }

Assim vc vai conseguir utilizar as variavies

// Declara as variáveis utilizadas na superclasse Estatistica: public int n; public double valor[]; public double Prob[];

Só para deixar claro, a segunda é a melhor opção.
Sempre que possível, evite métodos e atributos estáticos.

FJVasconcelos e ViniGodoy, valeu aí pelas dicas, vou tentar implementar essas dicas aqui e depois a outra classe.
Postei essa dúvida aqui e fui para a aula, levei a listagem para o professor ver, ele disse que eu teria que criar objetos para acessar os métodos. Putz !!!

Mas legal as dicas de vocês, acho muito melhor do que ficar criando um monte de objetos. Implementarei a outra classe e depois volto a perguntar se tiver mais dúvidas.

Obrigadão aí.

Só um parenteses nesse tópico. Alguém pode me responder por que para se usar a classe Button eu preciso criar objeto e para usar JOptionPane não ?

Olá, pessoal, voltei. Talvez com mais dúvidas ainda :frowning:

Seguinte, deixando tudo estático, dá certo, com exceção do método mostraDados, que não funicona.

Não sei por que, mas faço a entrada de dados normal e quando chamo o método para mostraDados para mostrar os dados, aparece que todos os dados são iguais a 0.0. Não sei por que isso está ocorrendo.
Para fins de testes, coloquei as linhas 48 e 56 no código, para ver se realmente a entrada de dados estava bem sucedida, e realmente está. mas o método mostraDados não está funcionando, como disse acima.

Também há outro problema que não sei resolver. Vejam a linha logo abaixo da chamada do método capturaNumeroDados, está dizendo que é para montar dois vetores, val e Prob com o número de dados n, retornado pelo método capturaNumeroDados. Mas o Eclipse mostra nessas linhas, 80 e 81, que as variáveis val e Prob nunca são lidas. O problema é que eu quero fazer a entrada de dados no método capturaDados, portanto, é lá que lerei essas variáveis. Mas dá erro no aplicativo, eu tenho que colocar as declarações dentro do próprio método capturaDados, como está nas linhas 39 e 40.

Agora, se eu declaro tudo como não estático, como propôs o ViniGodoy, volta a dar o mesmo problema de não poder fazer referência estática a campo não estático, minha nossa, alguém me explica isso, por favor.

Alguém aí poderia me ajudar a resolver esse problema ? Nossa, como estou tendo dificuldades em entender isso.
Vejam o código novo logo abaixo:

package mediaEDesvio;

import javax.swing.JOptionPane;
public class Estatistica
{
	// Declara as variáveis utilizadas na superclasse Estatistica:
    public static int n;
	public static double valor[];
	public static double Prob[];
	
	// Método construtor implícito para a classe Estatistica
	public Estatistica()
	{		
	}

	/*
	  Define o método capturaNumeroDados.
      Captura a quantidade de elementos a serem tratados
      Define os vetores valor e Prob com a quantidade de
      elementos definida pelo usuário.
    */
	
	public static int capturaNumeroDados()
	{	  
	    String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados");
        int n = Integer.parseInt(k);
        return n;
	 }
	
	
	/*
	   Define o método capturaDados
	   Captura os dados e os pesos de cada valor e os aloca
       em seus respectivos vetores/;
	*/
	
	public static void capturaDados(int n)
	{
	  double valor[] = new double[n];
      double Prob[] = new double[n];
	  for(int i=0;i<n;i++)
      {
	     String dado = JOptionPane.showInputDialog(null, "Qual o valor do dado " + (i+1));
	     double val = Double.parseDouble(dado);
	     valor[i] = val;
	     
	      // Testando a captura dos dados
	      System.out.println(valor[i]);
	     
	     
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");
	     double pes = Double.parseDouble(peso);
	     Prob[i] = pes;
	     
          // Testando a captura dos pesos dos dados
	      System.out.println(Prob[i]);
      }
	}
	
	// Método mostraDados
	 public static void mostraDados()
	 {

		 for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }
	 }
	
	
	public static void main(String args[])
	{
		 /* 
		    Chama o método capturaDados e cria os vetores
		    com o número dos dados digitados pelo usuário.
		 */
		
         int n = capturaNumeroDados();
         double valor[] = new double[n];
         double Prob[] = new double[n];
       
         /* Chama o método capturaDados passando como argumento
            o valor n (número de dados)
         */
         
         capturaDados(n);
         mostraDados();
         
         //Teste
         
         for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }
               
	}	
}

Mais uma vez agradeço !

Olá amigo…

vc está cometendo alguns erros…

[code]package mediaEDesvio;

import javax.swing.JOptionPane;
public class Estatistica
{
// Declara as variáveis utilizadas na superclasse Estatistica:
public static int n;
public static double valor[];
public static double Prob[];

// Método construtor implícito para a classe Estatistica
public Estatistica()
{		
}

/*
  Define o método capturaNumeroDados.
  Captura a quantidade de elementos a serem tratados
  Define os vetores valor e Prob com a quantidade de
  elementos definida pelo usuário.
*/

public static int capturaNumeroDados()// mude o metodo para VOID public static void capturaNumeroDados()
{	  
    String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados");
    int n = Integer.parseInt(k);// vc tem um variavél n estica e esta declarando uma outra.. use apenas assim " n = Integer.parseInt(k) " 
    return n;// Variavél n é estatica, ela pode ser vista em todo o contexto do seu programa, não precisa retorna-la
 }


/*
   Define o método capturaDados
   Captura os dados e os pesos de cada valor e os aloca
   em seus respectivos vetores/;
*/

public static void capturaDados(int n)// não precisa passar o n para função, ele é estatico e pode ser visto em todo programa: 	public static void capturaDados()
{
  double valor[] = new double[n];// vc já tem esses vetores estáticos no programa use apenas assim: valor[] = new double[n] 
  double Prob[] = new double[n];// vc já tem esses vetores estáticos no programa use apenas assim: Prob[] = new double[n]
  for(int i=0;i<n;i++)
  {
     String dado = JOptionPane.showInputDialog(null, "Qual o valor do dado " + (i+1));
     double val = Double.parseDouble(dado);
     valor[i] = val;
     
      // Testando a captura dos dados
      System.out.println(valor[i]);
     
     
     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");
     double pes = Double.parseDouble(peso);
     Prob[i] = pes;
     
      // Testando a captura dos pesos dos dados
      System.out.println(Prob[i]);
  }
}

// Método mostraDados
 public static void mostraDados()
 {

	 for(int j=0;j<n;j++)
     {
    	 System.out.println(valor[j]);
    	 System.out.println(Prob[j]);
     }
 }


public static void main(String args[])
{
	 /* 
	    Chama o método capturaDados e cria os vetores
	    com o número dos dados digitados pelo usuário.
	 */
	
     int n = capturaNumeroDados(); // a variavél n pode ser vista nesse metodo, não a declare denovo, chame apenas a função: capturaNumeroDados()

     double valor[] = new double[n];// mesma coisa aqui, o vetor VALOR[] pode ser visto aqui, não o declare denovo: não precisa dar new, pois já foi feito isso no metodo capturaDados(); exclua essas linha

     double Prob[] = new double[n];// mesma coisa aqui..........: não precisa dar new, pois já foi feito isso no metodo capturaDados(); exclua essas linha
   
     /* Chama o método capturaDados passando como argumento
        o valor n (número de dados)
     */
     
     capturaDados();// chame a função como está aqui
     mostraDados();// assim mesmo
     
     //Teste
     
     for(int j=0;j<n;j++)
     {
    	 System.out.println(valor[j]);
    	 System.out.println(Prob[j]);
     }
           
}	

}
[/code]

Tente rodar o codigo com as observações acima…

me de um retorno!!

Abraço!! Té mais>

Sobre isso, de uma olhada nesse site

Vc usa os métodos showInputDialog e outros… por eles serem estaticos, não tendo a nescessidade de criar um objeto para usalos…

da mesma fora que no metodo Main do seu programa acima, vc usa as funções da sua classe Estatistica sem precisa criar um objeto para usalos… tente criar uma outra classe e usar os metodos da sua Classe Estatisticas que vc vai percebir isso…

Não estou falando nenhuma bobeira né pessoal?? Corrijam-me se estiver errado!!

Abraço!!

FJVasconcelos, muito obrigado pela força que está me dando.
Mas o problema continua

Fiz as alterações que você disse e nas linhas 38 e 39 dão uns erros que são antigos nesse código.

Na linha 38 diz:


Erro de sintaxe no token “]”, VariableDeclaratorId esperado depois desse token
valor não pode ser resolvido para um tipo

Na linha 39 diz:


Vários marcadores nessa linha
Prob não pode ser resolvido para um tipo
Erro de sintaxe no token “]”, VariableDeclaratorId esperado depois desse token
Duplicar variável local $missing$

O novo código está logo abaixo, com as devidas alterações:

package mediaDesvio;
import javax.swing.JOptionPane;

public class Estatistica
{
    // Declara as variáveis utilizadas na superclasse Estatistica:   
    public static int n;   
    public static double valor[];   
    public static double Prob[];   
   
     // Método construtor implícito para a classe Estatistica   
     public Estatistica()   
     {         
     }   

	/*  
	  Define o método capturaNumeroDados.  
	  Captura a quantidade de elementos a serem tratados  
	  Define os vetores valor e Prob com a quantidade de  
	  elementos definida pelo usuário.  
	*/   
   
     public static void capturaNumeroDados()// mude o metodo para VOID public static void capturaNumeroDados()   
	{       
	    String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados");   
	    n = Integer.parseInt(k);  	  
	}   
   
   
	/*  
	   Define o método capturaDados  
	   Captura os dados e os pesos de cada valor e os aloca  
	   em seus respectivos vetores/;  
	*/   
   
	public static void capturaDados()  
	{   
	  valor[] = new double[n];  
	  Prob[] = new double[n];
	  
	  for(int i=0;i<n;i++)   
	  {   
	     String dado = JOptionPane.showInputDialog(null, "Qual o valor do dado " + (i+1));   
	     double val = Double.parseDouble(dado);   
	     valor[i] = val;   
	       
	      // Testando a captura dos dados   
	      System.out.println(valor[i]);   
	       
	       
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");   
	     double pes = Double.parseDouble(peso);   
	     Prob[i] = pes;   
	       
	      // Testando a captura dos pesos dos dados   
	      System.out.println(Prob[i]);   
	  }   
	}   
   
	// Método mostraDados   
	 public static void mostraDados()   
	 {   	
	     for(int j=0;j<n;j++)   
	     {   
	         System.out.println(valor[j]);   
	         System.out.println(Prob[j]);   
	     }   
	 }   
   
   
	public static void main(String args[])   
	{   
	     /*  
	        Chama o método capturaDados e cria os vetores  
	        com o número dos dados digitados pelo usuário.  
	     */   
	       
	     capturaNumeroDados(); // a variavél n pode ser vista nesse metodo, não a declare denovo, chame apenas a função: capturaNumeroDados()   
	  
	     
	     /* Chama o método capturaDados passando como argumento  
	        o valor n (número de dados)  
	     */   
	       
	     capturaDados();// chame a função como está aqui   
	     mostraDados();// assim mesmo   
	       
	     //Teste   
	       
	     for(int j=0;j<n;j++)   
	     {   
	         System.out.println(valor[j]);   
	         System.out.println(Prob[j]);   
	     }               
	}  

}

Na aula de hoje o professor me tirou algumas dúvidas, deixei tudo não estático, criei objetos para acessar os métodos, mas o problema dele não mostrar os dados persiste, as linhas de testes onde vou acrescentando os valores e logo depois peço para mostrar tais valores dão certo e mostram os valores dos índices dos vetores, mas o método mostraDados não.
Vou tentar resolver com os métodos estáticos primeiro, depois tento resolver com os não estáticos.

Se puder dar mais uma mão, agradeço muito !

Valeu aí

Pessoal, as coisas estavam funcionando, mas, seguindo o conselho do professor, passei tudo para não estático, atributos e métodos.
O problema agora é que o aplicativo apenas lê a quantidade de dados (método capturaNumeroDados) e simplesmente fecha a aplicação.
Por favor, alguém dê um help aí para mim !
Agradeço desde já

Com atributos e métodos não estáticos o código ficou da seguinte maneira:

package mediaEDesvio;

import javax.swing.JOptionPane;
public class Estatistica
{
	// Declara as variáveis utilizadas na superclasse Estatistica:
    public int n;
	public double valor[];
	public double Prob[];
	
	// Método construtor implícito para a classe Estatistica
	public Estatistica()
	{		
	}

	/*
	  Define o método capturaNumeroDados.
      Captura a quantidade de elementos a serem tratados
      Define os vetores valor e Prob com a quantidade de
      elementos definida pelo usuário.
    */
	
	public int capturaNumeroDados()
	{	  
	    String k = JOptionPane.showInputDialog(null, "Informe a quantidade de dados");
        int n = Integer.parseInt(k);
        return n;
	 }
	
	
	/*
	   Define o método capturaDados
	   Captura os dados e os pesos de cada valor e os aloca
       em seus respectivos vetores/;
	*/
	
	public void capturaDados(int n)
	{
	  double valor[] = new double[n];
      double Prob[] = new double[n];
      
	  for(int i=0;i<n;i++)
      {
	     String dado = JOptionPane.showInputDialog(null, "Qual o valor do dado " + (i+1));
	     double val = Double.parseDouble(dado);
	     valor[i] = val;
	     
	      // Testando a captura dos dados
	     System.out.println(valor[i]);
	     
	     
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");
	     double pes = Double.parseDouble(peso);
	     Prob[i] = pes;
	     
         // Testando a captura dos pesos dos dados
	     System.out.println(Prob[i]);
      }
	}
	
	// Método mostraDados
	 public void mostraDados(int n)
	 {

		 for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }
	 }
	
	
	public static void main(String args[])
	{
		 /* 
		    Chama o método capturaDados e cria os vetores
		    com o número dos dados digitados pelo usuário.
		 */
		
		 Estatistica captura = new Estatistica();
		 
		 captura.capturaNumeroDados();
		 
		  //double valor[] = new double[captura.n];
          //double Prob[] = new double[captura.n];
       
         /* Chama o método capturaDados passando como argumento
            o valor n (número de dados)
         */
                 
         captura.capturaDados(captura.n);
       
         captura.mostraDados(captura.n);
         
         //Teste
         /*
         for(int j=0;j<n;j++)
         {
        	 System.out.println(valor[j]);
        	 System.out.println(Prob[j]);
         }
         */
	}	
}

Hummmmmm, após ficar em cima do livro do Deitel por mais de duas horas e meia consegui resolver o problema.
FJVasconcelos, valeu aí pela força, ajudou muuuito.
Os problemas que estavam dando se resumiam na forma errônea pela qual estava criando os vetores, veja:

ERRADO:

valor[] = new double[n]
Prob[] = new double[n]

CORRETO:

valor = new double[n]
Prob = new double[n]

Sem os colchetes.

mas você ajudou barbaridade, amigo, muitíssimo obrigado mesmo.
Depois de tantos atropelos acho que irei me referir a uma frase de Fernando Pessoa, “Tudo vale a pena se a alma não é pequena

Digo isso por que com os erros que cometi nesse pequeno programinha me ajudou muito a entender melhor a utilizar métodos e atributos um pouco melhor. Também me ajudou a entender a usar os métodos não estáticos, a criar objetos para acessá-los e etc.

Agora preciso implementar a classe EstatisticaDescritiva.

Daqui a pouco apareço aqui com mais um punhado de dúvidas, mas estejam certos, antes de perguntar eu esudo e pesquiso muito.

Valeu aí