CLASSES - Como passar valores de um vetor de uma classe para outra classe?

Olá, pessoal, aqui estou eu novamente pedindo ajuda.

Bem, em outro tópico consegui, com a ajuda do pessoal aqui, a implementar uma classe chamada Estatistica, que deve ser usada para somente a entrada dos dados e também a quantidade de dados a serem tratados. Esses dados devem ser armazenados num vetor chamado valor[].

Agora devo implementar uma classe chamada EstatisticaIndutiva que estende a classe Estatistica e faça os cálculos necessários e mostre os dados.
O problema é que as duas classes devem possuir os métodos main(). Na classe Estatistica entro com os valores e na classe EstatisticaIndutiva esses valores devem ser calculados. Minha dúvida é como passar esses dados armazenados no vetor valor[] da classe Estatistica para a classe EstatisticaIndutiva. Se as duas classes têm o método main(), quando eu acabo de digitar os dados na classe Estatistica a aplicação não é encerrada ?
Como eu faço a classe EstatisticaIndutiva pegar os valores do vetor valor[] ?

Se somente a classe EstatisticaIndutiva tivesse a classe main() eu saberia resolver, mas estou com essa dúvida aí.

Podem me ajudar, por favor ?

Os códigos das duas classes estão logo abaixo:

Classe Estatisitca

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()
	{
		String k = JOptionPane.showInputDialog(null,"Informe a quantidade de dados");
		n = Integer.parseInt(k);
	}

	/*  
	  Define o método capturaDados.
	  Define os vetores valor e Prob com seus respectivos
	  número de elementos. 
	  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;   
	       
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");   
	     double pes = Double.parseDouble(peso);   
	     Prob[i] = pes;    
	  }   
	}

	/* 
	   Método mostraDados. Mostra os dados digitados no
	   método capturaDados.
	*/
	
	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[])
	{				
		  
		//Invoca o método capturaNumeroDados
		
		capturaNumeroDados();  

		//Invoca o método capturaDados  
		
		capturaDados();
		
		//Invoca o método mostraDados
		
		mostraDados(); 
	}
}

Classe EstatisticaIndutiva

package mediaDesvio;

public class EstatisticaIndutiva extends Estatistica
{
	private String saida;
	private double media;
	private double desvio;
	
    // Método construtor implícito para a classe EstatisticaIndutivo
	public EstatisticaIndutiva()
	{
		
	}
	
	/* 
	  Método construtor alternativo para a classe EstatisticaIndutiva
	  Usa atributo media
	*/
	
	public EstatisticaIndutiva(double average)
	{
		media = average;
	}
	
	private double calculaMedia()
	{
		return media;		
	}
	
	private double calculaDesvioPadrao()
	{
		return desvio;		
	}
	
	private void mostraResultado(double media, double desvio)
	{
		 
	}


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

}

Olha, posso estar enganado, mais você não precisa criar dois métodos MAIN. Se você estiver usando HERANÇA e extender a classe EstatísticaIndutiva de Estatisticas, automáticamente voce herda o metodo main dela.

Olá Valder Olmo Corrêa.

Você não precisa, usar dois métodos Main(). na classe EstatisticaIndutiva, no método main dela, como ela ira herdar da sua classe Estatistica, vc vai poder chamar todos os métodos que ela tem…

por exemplo:

public class Estatistica {
     public static int n;

     public static void capturaNumeroDados()  
     {  
         String k = JOptionPane.showInputDialog(null,"Informe a quantidade de dados");  
         n = Integer.parseInt(k);  
     } 
}

public class EstatisticaIndutiva  extends Estatistica{
      public static void main(String[] Args){
             //como seus métodos são estáticos vc nem precisaria usar o extends Estatistica para acessar.. mais como vc usou..
             EstatisticaIndutiva.capturaNumeroDados();//vc ira usar o mpetodo da sua calsse Estatistica na classe EstatisticaIndutiva
      }
}

Qaundo vc usa metodos estáticos, vc pode utiliza-los em outra classe assim:

      public class Teste{
       
            public static void main (String[] args){
                    Estatistica.capturaNumeroDados(); //vc iria usar o método sem precisar criar objeto e usar extends. 
            }

      }

Eu acho que é isso mesmo… tente assim que deve dar certoo…

Abraço…

Olá, xwillianss e FJVasconcelos.
Eu sei que não preciso usar dois métodos main(), mas o professor quer assim ! Esse é o problema ! :?

Vocês sabem resolver esse problema ?

FJVAsconcelos, você leu o meu último post no outro tópico ? Eu estava criando os vetores de forma errônea.

Bem, se puderem me dar mais essa ajuda, agradeço. Enquanto isso estou incrementado o código da classe EstatisticaIndutiva.

Valeu aí.

Olá, voltei !

A classe Estatisticaindutiva ficou da seguinte forma:

package mediaDesvio;

public class EstatisticaIndutiva extends Estatistica
{
	private String saida;
	private double media;
	private double desvio;
	
    // Método construtor implícito para a classe EstatisticaIndutivo
	public EstatisticaIndutiva()
	{		
	}
	
	/* 
	  Método construtor alternativo para a classe EstatisticaIndutiva
	  Usa atributo media
	*/
	
	public EstatisticaIndutiva(double average)
	{
		media = average;
	}
	
	private double calculaMedia()
	{
		for(int i=0;i<n;i++)
		{
			media = media + valor[i]*Prob[i];
		}
		return media;		
	}
	
	private double calculaDesvioPadrao()
	{
		for(int i=0;i<n;i++)
		{
			desvio = desvio + valor[i]*valor[i]*Prob[i];
		}
		
		desvio = desvio - media*media;
		desvio = Math.sqrt(desvio);		
		return desvio;		
	}
	
	private void mostraResultado(double media, double desvio)
	{
		System.out.println(media);
		System.out.println(desvio);
	}


	public static void main(String[] args)
	{
		// Cria objeto acessa do tipo EstatisticaIndutiva
		
		EstatisticaIndutiva acessa = new EstatisticaIndutiva();
		
		// Invoca 0 método calculaMedia por meio do objeto acessa
		acessa.calculaMedia();
		
		// Invoca 0 método calculaDesvioPadrao por meio do objeto acessa
		
		acessa.calculaDesvioPadrao();
		
		// Invoca o método mostraResultado por meio do objeto acessa
		
		acessa.mostraResultado(acessa.media,acessa.desvio);
	}
}

Mas não está funcionando !

Alguém por favor, poderia dar um help ?

Agradecido desde já !

[quote=Valder Olmo Corrêa]Olá, xwillianss e FJVasconcelos.
Eu sei que não preciso usar dois métodos main(), mas o professor quer assim ! Esse é o problema ! :?

Vocês sabem resolver esse problema ?

FJVAsconcelos, você leu o meu último post no outro tópico ? Eu estava criando os vetores de forma errônea.

Bem, se puderem me dar mais essa ajuda, agradeço. Enquanto isso estou incrementado o código da classe EstatisticaIndutiva.

Valeu aí.[/quote]

Olá amigo, li o post sim…

Como seu professor lhe disse, melhor usar métodos não estáticos…

Fala aí, camarada !
Legal, implementei outro aplicativo com os métodos não estáticos.
Mas quanto a isso o professor não exige que nesse exercício sejam usados métodos não estáticos, então, como já comecei o exercício com métodos estáticos, gostaria de terminá-lo assim mesmo.
Poderia dar mais uma força aí para eu poder terminar esse aplicativo do modo que já comecei ?
Preciso fazer a classe EstatisticaIndutiva receber os dados dos vetores valor[] e prob[] da classe Estatistica para terminar a aplicação.

Agradecido desde já.

Aqui estão suas duas classes

Classe Estatistica

[code]package mediaDesvio;

import javax.swing.JOptionPane;

public class Estatistica {
// Declara as variáveis utilizadas na superclasse Estatistica:
public static int n=0;

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() {
	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;

		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]);
	}
}

}[/code]

Classe EstatisticaIndutiva

[code]package mediaDesvio;

public class EstatisticaIndutiva {

public static String saida;

public static double media = 0;

public static double desvio = 0;

// Método construtor implícito para a classe EstatisticaIndutivo
public EstatisticaIndutiva() {

}

/*
 * Método construtor alternativo para a classe EstatisticaIndutiva Usa
 * atributo media
 */

public static void setAverage(double average) {
	media = average;
}

public static double calculaMedia() {
	for (int i = 0; i < Estatistica.n; i++){//Acessa o int n qeu é estático
		media = media + Estatistica.valor[i] * Estatistica.Prob[i];
	}
	return media;
}

public static double calculaDesvioPadrao() {
	for (int i = 0; i < Estatistica.n; i++)// trocar "n" por getN
	{
		// trocar "valor" e "prob" por getValor e getProb
		desvio = desvio + Estatistica.valor[i] * Estatistica.valor[i] * Estatistica.Prob[i];
	}

	desvio = (desvio - media) * media;//Reformule a conta ou: desvio - (media * media) ou (desvio - media) * media 
	desvio = Math.sqrt(desvio);
	return desvio;
}

public static void mostraResultado() {// vc já tem as variaveis na calsse
	System.out.println(calculaMedia());// chamar suas funçoes aqui Media
	System.out.println(calculaDesvioPadrao());// Desvio
}

public static void setarDados() {
	Estatistica.capturaNumeroDados();// Funçao da sua classe PAI vc a ve aqui poque ela é public
	Estatistica.capturaDados();// Funçao da sua classe PAI vc a ve aqui poque ela é public
	Estatistica.mostraDados(); // Funçao da sua classe PAI vc a ve aqui poque ela é public
}

public static void main(String[] args) {
	
	// Invoca o método mostraResultado e setaDados por meio do objeto acessa
	//EstatisticaIndutiva.setAverage(10) caso queira usar o Average
	EstatisticaIndutiva.setarDados();
	EstatisticaIndutiva.mostraResultado();
}

}

}[/code]

Eu acho que está tudo nos conformes, já que vc quer usar métodos estáticos…

procure refase-la usando métodos não estáticos e atributos tbm…

Abraço

Poxa, FJVasconcelos, nem sei como agradecer ! o código pronto !
Bem, fico muitíssimo agradecido, mas vou estudá-lo carinhosamente antes de implementá-lo, pois preciso aprender fazer isso funcionar direito.

E todos os métodos da classe Estatisticaindutiva devem ser private.

Bem, estudarei esse código que me enviou e depois tento passar os métodos da subclasse EstatisticaIndutiva para private, aí acho que é só criar objetos para acessá-los, certo ?

Vamos ver o que consigo !!

Mais uma vez, muito obrigado pela força que está me dando.

Até !

Tamo ai pra ajudar…

Quanto ao transformar os métodos em não estáticos, vc poderá usar
public, ou private… lembrando apenas de não usar static…

A vantagem de se sular os métodos não estáticos é que vc poderá dar restrições para o uso de sua classe.
ex…

Tem uma classe Pessoa que tem uma variavel "private int maiorIdade;"

para que ela seje acessada por outras classes, vc precisará dcirar os método getMaiorIdade() e para muda-lá, criará o método setMaiorIdade();
se essa variavél fosse estática, ela podria receber qualquer valor, por exemplo 12 (que não é maior idade); Sendo ela private
para mudar o seu valor, precisará chamar o seu método e passar o valor dela como parametro para ser atribuido a variavél, assim vc pode testar esse valor antes de setar na variavél…
EX

public void setMaiorIdade(int idade){
     if(idade >=18)
           maiorIdade = idade;
     else //imprime erro de idade
}

Por isso, que o recomendado é voce não usar métodos e variaveis estáticas…

Qualquer duvida estamos ai para ajudar…

flws…

[quote=Valder Olmo Corrêa]Poxa, FJVasconcelos, nem sei como agradecer ! o código pronto !
Bem, fico muitíssimo agradecido, mas vou estudá-lo carinhosamente antes de implementá-lo, pois preciso aprender fazer isso funcionar direito.

E todos os métodos da classe Estatisticaindutiva devem ser private.

Bem, estudarei esse código que me enviou e depois tento passar os métodos da subclasse EstatisticaIndutiva para private, aí acho que é só criar objetos para acessá-los, certo ?

Vamos ver o que consigo !!

Mais uma vez, muito obrigado pela força que está me dando.

Até ![/quote]

Aonde fica o encapsulamento neste código? Acho melhor você procurar uma linguagem procedural para resolver esse problema, tipo C,Pascal…

Opa, legal as dicas aí. Já estudei os códigos que me passou.
Valeu mesmo !

Mas preferi deixar o aplicativo de outra forma, com os métodos da sub classe private, pois é assim que deveria ser feito, pelo menos na UML que foi passada.

Olhem como ficou o código, acho simples, porém funcional da maneira que o profesor pediu:

Dêem uma avaliada para mim, digam se há uma forma de deixá-lo mais elegante e atraente, por favor:

Super Classe Estatistica:

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()
	{
		String k = JOptionPane.showInputDialog(null,"Informe a quantidade de dados");
		n = Integer.parseInt(k);
	}

	/*  
	  Define o método capturaDados.
	  Define os vetores valor e Prob com seus respectivos
	  número de elementos. 
	  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;   
	       
	     String peso = JOptionPane.showInputDialog(null, "Informe o peso do dado anterior");   
	     double pes = Double.parseDouble(peso);   
	     Prob[i] = pes;    
	  }   
	}

	/* 
	   Método mostraDados. Mostra os dados digitados no
	   método capturaDados.
	*/
	
	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[])
	{				
		  
		//Invoca o método capturaNumeroDados
		
		// capturaNumeroDados();  

		//Invoca o método capturaDados  
		
		// capturaDados();
				
		//Invoca o método mostraDados
		
		// mostraDados(); 
	}
}

Sub Classe EstatisticaIndutiva:

package mediaDesvio;

public class EstatisticaIndutiva extends Estatistica
{
	private String saida;
	private double media = 0;
	private double desvio = 0;
	
    // Método construtor implícito para a classe EstatisticaIndutivo
	public EstatisticaIndutiva()
	{		
	}
	
	/* 
	  Método construtor alternativo para a classe EstatisticaIndutiva
	  Usa atributo media
	*/
	
	public EstatisticaIndutiva(double average)
	{
		media = average;
	}
	
	private double calculaMedia()
	{
		for(int i=0;i<n;i++)
		{
			media = media + Estatistica.valor[i]*Estatistica.Prob[i];
		}
		return media;		
	}
	
	private double calculaDesvioPadrao()
	{
		for(int i=0;i<n;i++)
		{
			desvio = desvio + Estatistica.valor[i]*Estatistica.valor[i]*Prob[i];
		}
		
		desvio = desvio - media*media;
		desvio = Math.sqrt(desvio);		
		return desvio;		
	}
	
	private void mostraResultado(double media, double desvio)
	{
		
		// Teste
		
		System.out.println("Os valores dos dados são os seguntes :");
		
		for (int j = 0; j < n; j++)
		{
			System.out.println(valor[j]);
			System.out.println(Prob[j]);
		}
		
		System.out.println("A média dos valores é a seguinte :");
		System.out.println(media);
		
		System.out.println("O desvio padão dos valores é o seguinte :");
		System.out.println(desvio);
		
		// System.out.println(media);
		// System.out.println(desvio);
	}


	public static void main(String[] args)
	{
		
		capturaNumeroDados();
		
		capturaDados();
		
		// Cria objeto acessa do tipo EstatisticaIndutiva
		
		EstatisticaIndutiva acessa = new EstatisticaIndutiva();
		
		acessa.media = 0;
		
		// Invoca 0 método calculaMedia por meio do objeto acessa
		
		acessa.calculaMedia();
		
		acessa.desvio = 0;
		
		// Invoca 0 método calculaDesvioPadrao por meio do objeto acessa
		
		acessa.calculaDesvioPadrao();
		
		// Invoca o método mostraResultado por meio do objeto acessa
		
		acessa.mostraResultado(acessa.media,acessa.desvio);
	}
}

Notem que comentei todo o código do método main() da super classe, pois realmente não sei para que ele serve. Deixei os métodos de caputrar o número de dados e o caputraDados para serem chamdos pela sub classe.

Paciência, não sei para que o professor quis que colocássemos um método main() na super classe, realmente não entendi, mas já que ele quis, coloquei e deixei em branco, hahahahaha :lol:

Explicando:

A super classe é encarregada de apenas capurar o número de dados e os dados, somente isso, nada mais. Porém, o professor quer que nela haja um método main().
A classe filha EstatisticaIndutiva será responsável por fazer os cálculos e apresentar os dados na tela.

xwillianss, o exercício deve ser feito em Java, e os métodos da sub classe Estatisticaindutiva devem ser private, aí está o encapsulamento.

Valeu aí, pessoal !

Olá Valder…

Vc ainda continua usando métodos e variaveis estáticas na sua classe Estatistica…

De uma olhada nessa classe Estátistica e tente usa-la no seu projeto…

Classe Estatistica

[code]package mediaDesvio;
import javax.swing.JOptionPane;

public class Estatistica {
// Declara as variáveis utilizadas na superclasse Estatistica:
private int n;

private double[] valor;

private 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 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 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;

		String peso = JOptionPane.showInputDialog(null,
				"Informe o peso do dado anterior");
		double pes = Double.parseDouble(peso);
		Prob[i] = pes;
	}
}

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

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

// Adiociona métodos Set e get para que vc possa ter acesso as variaveis em
// sua classe que ira herdar
public int getN() {
	return n;
}

public void setN(int n) {
	this.n = n;
}

public double[] getProb() {
	return Prob;
}

public void setProb(double[] prob) {
	Prob = prob;
}

public double[] getValor() {
	return valor;
}

public void setValor(double[] valor) {
	this.valor = valor;
}

}[/code]

Poste suas duvidas ai que te ajudamos!!

Opa ! legal essa classe !
Vou implementá-la sim. Dessa forma terei que criar objetos para acessar os métodos, certo ?
Acho que fica mais legal mesmo. No diagrama de classes não há restrições quanto ao encapsulamento dos aributos e métodos da super classe. Vou fazer assim mesmo.
Mas agora, que estou mais tranquilo, preciso ajudar algumas pessoas também, né não ? O fórum existe para pedirmos ajuda e também para ajudarmos, estou visualizando pelo menos uns dois tópicos onde posso ajudar as pessoas.

Obrigadão mais uma vez, FJVasconcelos.

Oque vc irá fazer é usar Herança!!

Exemplo:

public class EstatisticaIndutiva extends Estatistica{
       //Agora vc terá acesso a todos os métodos publicos da classe Estatistica
      //ex:
       this.caoturaNumeroDados();
       this.capturaDados();
       // e mais outros métodos, lembrando que para acessar as váriaveis private da classe Estatistica, use os métodos set e get
}

Agora vc tem uma classe EstatisticaIndutiva que é “Filha” da Estatistica.

Abraço… Bom Trabalho…