Métodos tipo Static( Chamada entre eles )

4 respostas
L

Srs, bom dia!

Eu entendo que quando tempos métodos do tipo static dentro da mesma class seja possível fazer a chamada entre eles, sem que seja necessário a declaração de um objeto. Bom peço que se eu estiver errado alguém possa esclarecer este conceito.

No exemplo abaixo tenho uma classe Array_Variavel_Main que contem dois métodos do tipo static, são eles: average e main. Todos estão no mesmo arquivo.

Quando eu faço compilação do código em questão, tudo está correto, mas quando peço para executar o erro em questão é apresentado.

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '.'
    at java.util.Formatter.checkText(Formatter.java:2579)
    at java.util.Formatter.parse(Formatter.java:2555)
    at java.util.Formatter.format(Formatter.java:2501)
    at java.io.PrintStream.format(PrintStream.java:970)
    at java.io.PrintStream.printf(PrintStream.java:871)
    at Array_Variavel_Main.main(Array_Variavel_Main.java:21)

Eu fiz vários testes e inclusive penso que não seja erro no código. Mas tenho dificuldade de compreender alguns conceitos de O.O e propriedades de Classes, Objetos e métodos. Se alguém puder esclarecer essa questão, agradeço antecipadamente.

public class Array_Variavel_Main{
	
	public static double average( double... numbers )
	{
		double total = 0.0; //inicializa o total
		
		for( double d: numbers )
			total += d;
			
			return total / numbers.length;
	
	}//Fim do método average
	
	public static void main( String[] args )
	{
		double d1 = 10.00;
		double d2 = 20.00;
		double d3 = 30.00;
		double d4 = 40.00;
		
		System.out.printf( "D1 = %.1f\nd3 = %.f\n4 = %.1f\n\n", d1, d2, d3, d4 );
		
		System.out.printf( "Average of d1 and d2 is %.1f\n", 
			average( d1, d2 ) );
			
		System.out.printf( "Average of d1, d2 and d3 is %.1f\n", 
			average( d1, d2, d3 ) );
			
		System.out.printf( "Average of d1, d2, d3 and d4 is %.1f\n", 
			average( d1, d2, d3, d4 ) );			
			
		
	}	
}

4 Respostas

viniciosarodrigues

Olá Leandro, tentarei te explicar... Vamos lá!

Este erro que ocorreu foi por causa das conversões feitas nos 'Sytem.out.printf' que limita a quantidade de casas decimais. Não é bem um erro, na verdade funciona como uma máscara.

Já esta forma de parâmetros é chamada de varargs, é um tipo de parâmetro dinâmico, neste caso ele cria um vetor de double.
public static double average( double... numbers )
Nesta parte ele cria um uma variável chamada total e logo abaixo com um forech ele percorre todos os parâmetros e soma tudo a variável total e depois retorna a média(total/tamanho do vetor).
double total = 0.0; //inicializa o total  
          
        for( double d: numbers )  
            total += d;  
              
            return total / numbers.length;
Por último o main. Aqui ele declara 4 valores Reais, depois imprime todos os 4 ta tela, depois imprime na tela a média do primeiro valor com o segundo valor, depois a média do valor 1, 2 e 3... E assim por diante.
public static void main( String[] args )  
    {  
        double d1 = 10.00;  
        double d2 = 20.00;  
        double d3 = 30.00;  
        double d4 = 40.00;  
          
        System.out.printf( "D1 = %.1f\nd3 = %.f\n4 = %.1f\n\n", d1, d2, d3, d4 );  
          
        System.out.printf( "Average of d1 and d2 is %.1f\n",   
            average( d1, d2 ) );  
              
        System.out.printf( "Average of d1, d2 and d3 is %.1f\n",   
            average( d1, d2, d3 ) );  
              
        System.out.printf( "Average of d1, d2, d3 and d4 is %.1f\n",   
            average( d1, d2, d3, d4 ) );              
              
          
    }
Esta expressão abaixo é conhecida expressões regulares, muito úteis para validação, modificação, etc... Dá uma pesquisada na net que você acha bastante coisa.
"D1 = %.1f\nd3 = %.f\n4 = %.1f\n\n"
L

Vinicios, bom dia!

Obrigado por responder essa questão, você foi bem didático.

Só estou com uma duvida, se isso “não é bem um erro”, como eu faço para tratar essa limitação de impressão? Eu consigo usar uma outra classe que não seja System para que eu não fique preso a esta limitação? O que acontece nesse programa, que por causa dessa limitação eu não tenho opção de ver o resultado do aplicativo.

Obrigado.

viniciosarodrigues

Você pode usar o NumberFormat em cima dos valores já que é apenas para a impressão. Tem várias formas de saída de dados, e na verdade o System.out.print... é bem recomendado para iniciar, pois é bem simples e de rápida a execução, muito usado em testes.

Abaixo um exemplo usando o NumberFormat...
double d1 = 10.00;    
       double d2 = 20.00;    
       double d3 = 30.00;    
       double d4 = 40.00;

       NumberFormat f = new NumberFormat.getInstance(); // Instancia um NumberFormat
       f.setMaximumFractionDigits(0); // Limita a quantidade de casas decimais para 0.

System.out.printf( "Average of d1 and d2 is " +
           f.format(average( d1, d2 ) ));
viniciosarodrigues

O código com o NumberFormat excluindo as casas decimais.

import java.text.NumberFormat;

public class Array_Variavel_Main {

	public static double average(double... numbers) {
		double total = 0.0; // inicializa o total

		for (double d : numbers)
			total += d;

		return total / numbers.length;

	}// Fim do método average

	public static void main(String[] args) {
		double d1 = 10.00;
		double d2 = 20.00;
		double d3 = 30.00;
		double d4 = 40.00;
		NumberFormat f = NumberFormat.getInstance();
		f.setMaximumFractionDigits(0);

		System.out.println("Os valores foram " + d1 + ", " + d2 + ", " + d3
				+ " e " + d4);

		System.out.println("\nA média do D1 com o D2 é: "
				+ f.format(average(d1, d2)));

		System.out.println("A média dos valores D1, D2, e D3 é: "
				+ f.format(average(d1, d2, d3)));

		System.out.println("A média dos valores D1, D2, D3 e D4 é: "
				+ f.format(average(d1, d2, d3, d4)));

	}
}
Criado 1 de julho de 2014
Ultima resposta 1 de jul. de 2014
Respostas 4
Participantes 2