Métodos tipo Static( Chamada entre eles )

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

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).

[code]double total = 0.0; //inicializa o total

    for( double d: numbers )  
        total += d;  
          
        return total / numbers.length;  [/code]

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.

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

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"

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.

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…

[code]
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 ) ));[/code]

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

	}
}